web-dev-qa-db-ja.com

非同期待機とスレッド

私はasync-awaitとタスクですが、1つだけ理解できません。

非同期タスクは別のスレッドで実行されますか?

Msdnが言うように( 非同期プログラミング ):

Asyncおよびawaitキーワードによって、追加のスレッドが作成されることはありません。非同期メソッドは独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。

しかし、ThreadPoolクラスの説明の注釈( ThreadPoolクラス ):

スレッドプールスレッドを使用する操作の例は次のとおりです。

タスクまたはタスクオブジェクトを作成して一部のタスクを非同期で実行すると、デフォルトでは、タスクはスレッドプールスレッドで実行されるようにスケジュールされます。

そのため、asyncタスクが別のスレッドを使用するかどうかがわかりません。説明してください。ありがとう。

7
Roman Doskoch

Task必然的に余分なスレッドを表しません。

await a Taskの場合、「誰か」がTaskを完了として設定するまで、メソッドの呼び出し元に制御フローを返します。

Task.Run()またはTask.Factory.StartNew()を介してTaskを開始すると、これらの呼び出しに渡すアクションは別のスレッド(新しいスレッドではなく、 ThreadPool)。

8
René Vogt

async/awaitは Tasks で動作します(正確には、「awaitables」で動作しますが、「Task」と言うだけでこの議論には十分です)。

タスクは、「後で完了する作業の単位」を表します。その作業単位は、_Task.Run(_を介して開始されたスレッドプールからの新しいスレッドである可能性があり、システムIO call like DbDataReader.ReadAsync() 、または TaskCompletionSource からのイベントによってトリガーされる可能性があります。

Stephen Clearyの asyncを読んで、イントロ を待って、

4

簡単に言うと、Taskは別のThreadで実行できるだけでなく、呼び出し元Threadでも実行できます。タスクは、呼び出し元Threadに実行するリソースがない場合、ThreadPoolからThreadを取得します[〜#〜] only [〜#〜]別のTaskTaskは、別のThread(アイドルモード)を実行するのに十分なリソースがある場合、呼び出し元Taskで実行されます。

スレッドと比較すると、タスクは高レベルの抽象化であり、スレッドによってサポートされる場合とされない場合がありますの並行操作を表します。タスクは構成的です(継続を使用してタスクを連鎖させることができます)。スレッドプールを使用して起動待ち時間を短縮でき、TaskCompletionSourceを使用すると、I/Oバウンド操作を待機している間スレッドを完全に回避するコールバックアプローチを活用できます。

出典:ジョセフ・アルバハリ、ベン・アルバハリによる565ページ「一言で言えばC#5.0」。

4
Karolis Kajenas