Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

awaitの意味は、スレッドを留めずにCallbackを待つということらしい。
async/awaitはそういう動きをする、非同期プログラムを容易に記述できる。

非同期処理の実装の歴史

Thread、ThreadPool?

従来の、マルチスレッド・プログラミング。

APM、EAP (Control.Invoke)

「Windowsメッセージングキュー(Control.Invoke)」による方式。

Open棟梁の「非同期呼出フレームワーク」がこの方式で実装されている。

TAP (async/await)

async/awaitは、TAP(Task-based Asynchronous Pattern)の方式で実装されている。

用途

使い方

タスク分割方法

await(Task.Run)を切れ目として、
プログラマが意識して時間のかかるバックグラウンド処理
(ネットワーク バインドまたは I/O バインドの処理)を分割する。

仕組み

使い方

非同期メソッドの戻り値

void型

Fire & Forgetの場合、戻り値は不要。

Task型

Awaitableの場合、

Task<T>型

Awaitableの場合、

Task.FromResult?

Task.FromResult?を使用して、完了状態のTaskを生成することができる。

詳細については、下記を参照。

非同期メソッドの呼び出し

Task.Run()、Task.Wait()メソッド

Task.WhenAll?()

await演算子

詳細

ここでは、

組み合わせによって、await後の処理が、
どのように実行されるのかについて説明する。

非同期メソッドの種類

Fire & Forget

Awaitable

同期コンテキスト

実行環境によって持つ同期コンテキストの種類が異なる。

GUIアプリケーション

GUIアプリケーションでの同期コンテキストは
「Windowsメッセージングキュー(Control.Invoke)」になる。

Consoleアプリケーション

Consoleアプリケーションでの同期コンテキストは「null」になる。

ThreadPool?

Task.Runを使用した場合の同期コンテキストは、
マルチスレッド環境下の「ThreadPool?」になる。

ASP.NET

ASP.NETアプリケーションでの同期コンテキストは
マルチスレッド環境下の「System.Threading.SynchronizationContext?.Current」になる。

詳しくは、非同期Controllerを参考にする。

この辺の

スタック・トレースを見ると、

同じ事らしいと解る。

並列実行

並列実行を始めるので、

特に、Consoleアプリケーションの同期コンテキスト下では、
新規に同期処理の実装が必要になることがある。

ConfigureAwait?

awaitの挙動は、Awaitableパターンというものを満たすクラスを作ることで、自由にカスタマイズできるらしい。

スレッド同期

async/awaitは非同期呼び出しで投げっぱなす場合に利用されるため、
スレッド同期をあまり考慮していないが、スレッド同期を行う場合は以下に注意する。

仕組みから

スレッドを使用した処理を記述しないが、分割されたタスクは、

このため、一連の処理が(分割されたタスクが)、

スレッド同期ツールキットは使用不可

従って、スレッド同期のlock等は無意味。
従来のスレッド同期ツールキットは使用不可。

lock/mutex/semaphoreはtaskで全て使用禁止

WaitFor?[Single|Multi]Objectは例外的に使用可

これは、Win32の待機関数のWaitFor?[Single|Multi]Objectは、
スレッドに限らず様々な「オブジェクト」の状態が変化する(シグナル状態になる)のを待つ関数であるためと考える。

その他

進捗報告

上記の仕組みで動いているとすると、進捗報告をどう実装するかが?であるが、
以下を見ると、Progressクラス、IProgress<T>インターフェースを使用するらしい事が解る。

詳しい仕組みは不明だが、GUI上で動作しているため、
同期コンテキストのControl.Invokeを使用しているものと思われる。

参考


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS