非同期処理

ドキュメント:

C# での非同期プログラミング | Microsoft Docs [公式]

概要

参考:

Unity で async / await、Task 入門!非同期処理をスマートに書く | LIGHT11

Task を極めろ! async / await 完全攻略 – Qiita

使い方

参考:

非同期処理を理解する async / await 編 – Qiita

async / await についての備忘録 – Qiita

タスク (Task)

参考:

Unity 2017 で始める Task – Qiita

SynchronizationContext と Task の await – Qiita

今更ですが、async / await – Qiita

Task クラス | Microsoft Docs [公式]

Task.WhenAll メソッド | Microsoft Docs [公式]

別スレッドで実行する

  • Task.Run与えられたタスクを、スレッドプールから取り出した別スレッドで実行する

参考:

初心者のための Task.Run()、async / await の使い方 – Qiita

Task を使って UI を固めずに重い処理をする – Qiita

Unity における async / await を使った非同期実装について | おれんじりりぃぶろぐ

スレッドプールとタスク | 未確認飛行 C

Task.Run メソッド | Microsoft Docs [公式]

デッドロック

デッドロック

(出典飽きっぽい人のブログ

現象:

タスクに対して、Result プロパティを取得、あるいは、Wait メソッドを実行すると、デッドロックが発生する。

対処法 1:

タスクの終了を await で待つ。

async Task DoTask()
{
    var result = await KindOfTask();
}Code language: C# (cs)

対処法 2:

元のコンテキストに戻らないように、ConfigureAwaitfalse を指定して呼び出し、待機オブジェクトにおいて同期コンテキストの設定を変更しておく。

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 [公式]

非同期モデル

参考:

避けて通れない非同期処理を克服しよう | @IT

タスクを返す必要性

一般に、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

HttpClient 詳解、或いは非同期の落とし穴について – SlideShare

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA