よくわかりません。 1人または多数Task
シングルスレッドで並列に実行する?私の理解並列性明らかに間違っています。
MSDNのビット私は頭を包むことはできません:
asyncキーワードとawaitキーワードによって追加のスレッドが発生することはありません。 作成した。非同期メソッドはマルチスレッドを必要としません メソッドはそれ自身のスレッドでは実行されません。メソッドは現在のメソッドで実行されます。 同期コンテキストを使用して、スレッドの時間を メソッドはアクティブです。
..そして:
タスクの開始から待機までの間に、他のタスクを開始できます。 追加のタスクは暗黙的に並列実行されますが、追加のタスクはありません。 スレッドが作成されます。
それらは並行して走るのではなく、交代します。実行中のタスクの進行状況がブロックされると、その状態が保存され、準備が整ったタスクに制御が移ります。これは協調的マルチタスクであり、真の並列処理ではありません。
スレッドはサンプル原則に基づいて動作します。しかし、強調したいことがいくつかあります。
まず、という理由だけでasync
/await
OSのスレッドではありません:
第二に、行動の違い:
async
/await
協調的マルチタスクを使用し、Win32スレッドは横取りを使用します。そのため、すべてのブロッキング操作で明示的にasync
/await
モデル。そのため、yieldされていない関数へのブロッキング呼び出しを行うことで、スレッド全体とそのすべてのタスクをブロッキングすることになります。Stephenがコメントで指摘しているように、あなたはできるマルチスレッド同期コンテキストを使用すると、(すべての複雑さと潜在的な競合状態と共に)複数のOSスレッドで同時に実行されます。しかし、MSDNの引用はシングルスレッドのコンテキストに関するものでした。
最後に、この同じ設計パラダイムが使用されている他の場所では、以下のための優れた実践について多くを学ぶことができます。async
/await
これらを学ぶことによって:
async
メソッドはブロックされたときの状態と歩留まりを保存しますにawait
。ブロッキングコードを実行している場合(Thread.Sleep
)、それからその状態と収量を保存しませんでした。 - Stephen Clearyawait SomeMethodAsync()
AWAITのため、新しいスレッドを作成しません。 SomeMethodAsyncが新しいスレッドを作成すると、新しいスレッドが作成されます(必ずしもそうではありません)。 - igrimpeasync
シングルスレッド内で実行されるメソッドSynchronizationContext
(UIコンテキストなど)コンソールアプリケーションまたはバックグラウンドスレッドから実行されている場合は、Task
sはスレッドプールで実行され、意志以下の場合を除いて、並列に(マルチスレッドで)実行します。await
それぞれ個別に。 - Stephen Cleary