私はasync-await
とタスクですが、1つだけ理解できません。
非同期タスクは別のスレッドで実行されますか?
Msdnが言うように( 非同期プログラミング ):
Asyncおよびawaitキーワードによって、追加のスレッドが作成されることはありません。非同期メソッドは独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。
しかし、ThreadPool
クラスの説明の注釈( ThreadPoolクラス ):
スレッドプールスレッドを使用する操作の例は次のとおりです。
タスクまたはタスクオブジェクトを作成して一部のタスクを非同期で実行すると、デフォルトでは、タスクはスレッドプールスレッドで実行されるようにスケジュールされます。
そのため、async
タスクが別のスレッドを使用するかどうかがわかりません。説明してください。ありがとう。
Task
は必然的に余分なスレッドを表しません。
await
a Task
の場合、「誰か」がTask
を完了として設定するまで、メソッドの呼び出し元に制御フローを返します。
Task.Run()
またはTask.Factory.StartNew()
を介してTask
を開始すると、これらの呼び出しに渡すアクションは別のスレッド(新しいスレッドではなく、 ThreadPool)。
async/awaitは Tasks で動作します(正確には、「awaitables」で動作しますが、「Task」と言うだけでこの議論には十分です)。
タスクは、「後で完了する作業の単位」を表します。その作業単位は、_Task.Run(
_を介して開始されたスレッドプールからの新しいスレッドである可能性があり、システムIO call like DbDataReader.ReadAsync()
、または TaskCompletionSource
からのイベントによってトリガーされる可能性があります。
Stephen Clearyの asyncを読んで、イントロ を待って、
簡単に言うと、Task
は別のThread
で実行できるだけでなく、呼び出し元Thread
でも実行できます。タスクは、呼び出し元Thread
に実行するリソースがない場合、ThreadPool
からThread
を取得します[〜#〜] only [〜#〜]別のTask
。 Task
は、別のThread
(アイドルモード)を実行するのに十分なリソースがある場合、呼び出し元Task
で実行されます。
スレッドと比較すると、タスクは高レベルの抽象化であり、スレッドによってサポートされる場合とされない場合がありますの並行操作を表します。タスクは構成的です(継続を使用してタスクを連鎖させることができます)。スレッドプールを使用して起動待ち時間を短縮でき、TaskCompletionSourceを使用すると、I/Oバウンド操作を待機している間スレッドを完全に回避するコールバックアプローチを活用できます。
出典:ジョセフ・アルバハリ、ベン・アルバハリによる565ページ「一言で言えばC#5.0」。