非同期処理
ドキュメント:
C# での非同期プログラミング | Microsoft Docs [公式]
概要
参考:
Unity で async / await、Task 入門!非同期処理をスマートに書く | LIGHT11
Task を極めろ! async / await 完全攻略 – Qiita
使い方
参考:
非同期処理を理解する async / await 編 – Qiita
async / await についての備忘録 – Qiita
タスク (Task)
参考:
SynchronizationContext と Task の await – Qiita
Task クラス | Microsoft Docs [公式]
Task.WhenAll メソッド | Microsoft Docs [公式]
別スレッドで実行する
- Task.Run:与えられたタスクを、スレッドプールから取り出した別スレッドで実行する
参考:
初心者のための Task.Run()、async / await の使い方 – Qiita
Task を使って UI を固めずに重い処理をする – Qiita
Unity における async / await を使った非同期実装について | おれんじりりぃぶろぐ
Task.Run メソッド | Microsoft Docs [公式]
デッドロック
(出典:飽きっぽい人のブログ )
現象:
タスクに対して、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 [公式]
非同期モデル
参考:
タスクを返す必要性
一般に、async
による非同期メソッドはタスクを返すことが望ましい。
原因:
- メソッドの使用者が非同期メソッドの処理を待ちたいケースに対応するため。
- 例外が補足できなくなる。
対処法:
async void
を避け、Task
を返すようにする。
async
を用いて非同期メソッドを作成する際は、タスクを返すようにする。
async Task DoSomethingAsync()
{
// code here
}
Code language: C# (cs)
参考:
async / await / Task の使い方備忘録 – Qiita
Task を極めろ! async / await 完全攻略 – Qiita
await 利用時の同期コンテキストと実行スレッドの動きについてコードを動かして見ていく – Qiita
まとめ/Tips
参考:
Unity で async / await、Task を完全に理解する!基礎から応用まで非同期処理を総まとめ | LIGHT11
Task.Run() ではなく用意されている非同期メソッドを使おう – Qiita
await 利用時の同期コンテキストと実行スレッドの動きについてコードを動かして見ていく – Qiita
非同期プログラミングのベストプラクティス | Microsoft Docs [公式]
資料
さては非同期だなオメー! async / await 完全に理解しよう – SlideShare
async / await のしくみ – SlideShare
Deep Dive async / await in Unity with UniTask / UniRx.Async – SlideShare