非同期処理
概要
ドキュメント:
C# での非同期プログラミング | Microsoft Docs [公式]
参考:
Unity で async / await、Task 入門!非同期処理をスマートに書く | LIGHT11
Task を極めろ! async / await 完全攻略 – Qiita
使い方
ドキュメント:
Awaitable の完了と継続 | Unity マニュアル [公式]
参考:
非同期処理を理解する async / await 編 – Qiita
async / await についての備忘録 – Qiita
非同期処理と async/await | Annulus Games
導入
参考:
もう怖くない! Unity での Task / async-await の基礎と実践 – Qiita
タスク (Task)
ドキュメント:
Task クラス | Microsoft Docs [公式]
Task.WhenAll メソッド | Microsoft Docs [公式]
参考:
SynchronizationContext と Task の await – Qiita
別スレッドで実行する
- Task.Run: 与えられたタスクを、スレッドプールから取り出した別スレッドで実行する
ドキュメント:
Task.Run メソッド | Microsoft Docs [公式]
参考:
初心者のための Task.Run()、async / await の使い方 – Qiita
Task を使って UI を固めずに重い処理をする – Qiita
Unity における async / await を使った非同期実装について | おれんじりりぃぶろぐ
デッドロック
(出典:飽きっぽい人のブログ )
現象:
タスクに対して、Result プロパティを取得、あるいは、Wait メソッドを実行すると、デッドロックが発生する。
対処法 1:
タスクの終了を await で待つ。
async Task DoTask()
{
var result = await KindOfTask();
}Code language: C# (cs)
対処法 2:
元のコンテキストに戻らないように、ConfigureAwait に false を指定して呼び出し、待機オブジェクトにおいて同期コンテキストの設定を変更しておく。
async Task<int> KindOfTask()
{
await DoSomethingAsync().ConfigureAwait(false);
return 42;
}Code language: C# (cs)
参考:
SynchronizationContext と Task の await – Qiita
async / await – 非同期なライブラリは楽じゃない | 飽きっぽい人のブログ
Task を極めろ! async / await 完全攻略 – Qiita
Task / async / await を理解する | 独立型戦闘支援ブログ
Task.ConfigureAwait メソッド | Microsoft Docs [公式]
UI を操作する
参考:
別スレッドからの UI 操作についての備忘録 – Qiita
スレッドセーフなコントロールの呼び出し | so-zou.jp
同期コンテキスト
ドキュメント:
SynchronizationContext クラス | Microsoft Docs [公式]
SynchronizationContext.Current プロパティ | Microsoft Docs [公式]
SynchronizationContext.SetSynchronizationContext メソッド | Microsoft Docs [公式]
SynchronizationContext.Post メソッド | Microsoft Docs [公式]
非同期モデル
参考:
AnimatorController
参考:
async/await で Animator の終了待ち/切り替えをする | ねこみみだいまおう
タスクを返す必要性
一般に、async による非同期メソッドはタスクを返すことが望ましい。
原因:
- メソッドの使用者が非同期メソッドの処理を待ちたいケースに対応するため。
- 例外が補足できなくなる。
対処法:
async voidを避け、Taskを返すようにする。
async を用いて非同期メソッドを作成する際は、タスクを返すようにする。
async Task DoSomethingAsync()
{
// code here
}Code language: C# (cs)
参考:
async / await / Task の使い方備忘録 – Qiita
Task を極めろ! async / await 完全攻略 – Qiita
await 利用時の同期コンテキストと実行スレッドの動きについてコードを動かして見ていく – Qiita
使い分け
参考:
コルーチン vs async/await – Unity の非同期処理はどっちを使う? | ういやまラボ
Tips
非同期プログラミングのベストプラクティス | Microsoft Docs [公式]
まとめ/Tips
Unity で async / await、Task を完全に理解する!基礎から応用まで非同期処理を総まとめ | LIGHT11
Task.Run() ではなく用意されている非同期メソッドを使おう – Qiita
await 利用時の同期コンテキストと実行スレッドの動きについてコードを動かして見ていく – Qiita
資料
さては非同期だなオメー! async / await 完全に理解しよう – SlideShare
async / await のしくみ – SlideShare
Deep Dive async / await in Unity with UniTask / UniRx.Async – SlideShare
