Похожие презентации:
Best practices: Async vs Coroutines
1.
Bestpractices:
Async vs
Coroutines
Dmitriy Chebanov
2.
О спикере• В разработке 8+ лет
• Ментор в DevSauna
• Руковожу командой разработки XR продуктов
Telegram
GitHub
dima-chebanov
DmitrySx
ChebanovDD
2
3.
Почему эта тема?• Практически никто не использует async/await
3
4.
Практически никто не используетAvoid using async and await
The Unity API is not thread safe and therefore, you should
not use async and await tasks. Async tasks often allocate
objects when invoked, which might cause performance issues
if you overuse them.
4
5.
Практически никто не используетAvoid using async and await
The Unity API is not thread safe and therefore, you should
not use async and await tasks. Async tasks often allocate
objects when invoked, which might cause performance issues
if you overuse them.
Limitations of async and await tasks
The Unity API isn’t thread safe and therefore, you should
only use async and await tasks from inside the
UnitySynchronizationContext. Async tasks often allocate
objects when invoked, which might cause performance issues
if you overuse them.
5
6.
Почему эта тема?• Практически никто не использует async/await
• Мало полезного материала на эту тему
6
7.
Мало полезного материала на эту тему7
8.
Какие на сегодня цели?• Понять основные отличия coroutines от async
• Научиться правильно использовать async/await
• Показать на практике как это можно применять
• Убедить Вас, что не так страшен чёрт, как его малюют
8
9.
UniTask• Основан на struct
• Позволяет применять await ко всем AsyncOperations и
Coroutines
• Не использует потоки и работает на Unity's PlayerLoop,
следовательно работает на WebGL
• Совместим с Task / ValueTask / IValueTaskSource
• Имеет практически такой же API как и Task
9
10.
CoroutineAsync / UniTask
Doesn’t have return value
Has return value
Doesn’t support try/catch
Supports try/catch
Doesn’t preserve call stack
Preserves call stack
Doesn’t always exit
Always exits
Lifetime tied to a MonoBehaviour Lifetime handled manually
10
11.
CoroutineAsync / UniTask
Doesn’t have return value
Has return value
Doesn’t support try/catch
Supports try/catch
Doesn’t preserve call stack
Preserves call stack
Doesn’t always exit
Always exits
Lifetime tied to a MonoBehaviour Lifetime handled manually
11
12.
CoroutineAsync / UniTask
Doesn’t have return value
Has return value
* These examples are not production quality. Do not copy them into your product!
12
13.
CoroutineAsync / UniTask
Doesn’t have return value
Has return value
Doesn’t support try/catch
Supports try/catch
Doesn’t preserve call stack
Preserves call stack
Doesn’t always exit
Always exits
Lifetime tied to a MonoBehaviour Lifetime handled manually
13
14.
CoroutineAsync / UniTask
Doesn’t support try/catch
Supports try/catch
Compiler error!
Works!
* These examples are not production quality. Do not copy them into your product!
14
15.
CoroutineAsync / UniTask
Doesn’t have return value
Has return value
Doesn’t support try/catch
Supports try/catch
Doesn’t preserve call stack
Preserves call stack
Doesn’t always exit
Always exits
Lifetime tied to a MonoBehaviour Lifetime handled manually
15
16.
CoroutineAsync / UniTask
Doesn’t preserve call stack
Preserves call stack
16
17.
CoroutineAsync / UniTask
Doesn’t preserve call stack
Preserves call stack
17
18.
CoroutineAsync / UniTask
Doesn’t preserve call stack
Preserves call stack
18
19.
CoroutineAsync / UniTask
Doesn’t have return value
Has return value
Doesn’t support try/catch
Supports try/catch
Doesn’t preserve call stack
Preserves call stack
Doesn’t always exit
Always exits
Lifetime tied to a MonoBehaviour Lifetime handled manually
19
20.
CoroutineAsync / UniTask
Doesn’t always exit
Always exits
Leaks if owning
MonoBehaviour is destroyed!
Never leaks!
* These examples are not production quality. Do not copy them into your product!
20
21.
CoroutineAsync / UniTask
Doesn’t have return value
Has return value
Doesn’t support try/catch
Supports try/catch
Doesn’t preserve call stack
Preserves call stack
Doesn’t always exit
Always exits
Lifetime tied to a MonoBehaviour Lifetime handled manually
21
22.
CoroutineAsync / UniTask
Lifetime tied to a MonoBehaviour Lifetime handled manually
* These examples are not production quality. Do not copy them into your product!
22
23.
Live Coding...• Параллельная загрузка и показ изображений
• Последовательная загрузка и показ изображений
• Загрузка и показ изображений по готовности
23
24.
Deadlock24
25.
Deadlock25
26.
Deadlock26
27.
Deadlock27
28.
Deadlock28
29.
Deadlock29
30.
Deadlock30
31.
Deadlock31
32.
Deadlock32
33.
Deadlock33
34.
Deadlock34
35.
Deadlock35
36.
Deadlock36
37.
Deadlock37
38.
Deadlock38
39.
Deadlock39
40.
Deadlock40
41.
Deadlock41
42.
Deadlock42
43.
Deadlock43
44.
Deadlock44
45.
Deadlock45
46.
Deadlock46
47.
Deadlock47
48.
Deadlock48
49.
Deadlock49
50.
Как исправить первый пример?50
51.
Как исправить первый пример?51
52.
Как исправить первый пример?52
53.
Как исправить первый пример?53
54.
Итого• Нет .Result и .Wait
• Избегайте async void
• Используйте CancelationToken
54
55.
Итого• Нет .Result и .Wait
• Избегайте async void
• Используйте CancelationToken
• Не используйте Coroutine для управления Task
55
56.
Материалы• Async vs Coroutines – Unite Copenhagen
• 8 await/async mistakes that you SHOULD avoid in .NET
• Correcting Common Async/Await Mistakes in .NET
• Best Practices for Using Async and Await
• Async and Await, All the Things Your Mother Never Told You
• AsyncGuidance
56
57.
Спасибо завнимание!
Dmitriy Chebanov
Telegram
GitHub
dima-chebanov
DmitrySx
ChebanovDD