Windows Phone 8 の UI スレッドから await ReadToEndAsync を呼び出した場合、ReadToEndAsync はどのコンテキストで機能しますか? タスクが UI スレッド自体によって処理のためにキューに入れられるか、それとも新しいスレッドが作業を行うか。
これに基づいて:
UIスレッドで実行されるようです。
Windows Phone 8 の UI スレッドから await ReadToEndAsync を呼び出した場合、ReadToEndAsync はどのコンテキストで機能しますか? タスクが UI スレッド自体によって処理のためにキューに入れられるか、それとも新しいスレッドが作業を行うか。
これに基づいて:
UIスレッドで実行されるようです。
async
これは、最も純粋な形での本質的な真実です。つまり、スレッドはありません。
真の非同期ストリームの場合、ReadToEndAsync
ほとんど作業はありません。そのメソッドを呼び出すと、ランタイムに最後まで読み取るように要求し、操作が完了したときに ( を介してTask
) 通知するだけです。ランタイムは OS に目を向け、読み取りを要求し、操作が完了すると (IOCP などを介して) 通知します。OS はデバイス ドライバーにアクセスし、デバイス ドライバーに読み取りを要求し、操作が完了すると (たとえば、IRP を介して) 通知します。デバイス ドライバはデバイスにアクセスして読み取りを要求し、操作が完了すると (IRQ などを介して) 通知します。
スレッドはありません。
もちろん、これは理想的な状況です。現実の世界では、ある時点で「読み取りから終了」操作がいくつかの「n バイト読み取り」操作に分割され、それらをつなぎ合わせる必要があります。その (わずかな) 量の作業は、借用したスレッド (カーネル モード コードの認識できないスレッドとユーザー モード コードのスレッド プール スレッド) を使用して行われます。
また、非同期 API が存在しない状況もあります。そのような場合、非同期作業はスレッド プール スレッドを使用して偽造されます。たとえば、 を呼び出す場合ReadToEndAsync
、MemoryStream
メモリから読み取るための非同期 API がないため、これはスレッド プールで実行される偽の非同期操作です。
しかし、非同期操作を実行するスレッドが常に存在しなければならないという考えは真実ではありません。スレッドを制御しようとしないでください — それは不可能です。代わりに、真実を理解するようにしてください。スレッドはありません。
編集:この回答をブログ投稿に拡張しました。