17

タイトルが示唆する私の質問は、「async」と「await」の背景についてです。

現在のスレッドが「await」キーワードに到達すると、「sleep」になり、awaitメソッドが完了するとウェイクアップすると言うのは本当ですか?

ありがとう!

4

3 に答える 3

30

現在のスレッドが「await」キーワードに達すると、「スリープ」になり、await メソッドが完了するとウェイクアップするというのは本当ですか?

いいえ。要点は、スレッドが他の作業を行っている可能性があるときにスレッドがスリープ状態になるのasync避けることです。さらに、非同期メソッドを実行しているスレッドが UI スレッドである場合、まったくスリープ状態にしないで、他のイベントで使用できるようにする必要があります。

実行がawait式に達すると、生成されたコードは、待っているものが既に利用可能かどうかをチェックします。もしそうなら、あなたはそれを使って続けることができます。それ以外の場合は、「待機可能」部分に継続を追加し、すぐに戻ります。

継続により、待機可能な値の準備ができたときに、非同期メソッドの残りの部分が確実に実行されるようになります。どのスレッドで発生するかは、待機しているコンテキストによって異なります-非同期メソッドがスレッドプールスレッドで実行されている場合、メソッドが開始されたスレッドとは異なるスレッドで継続が実行される可能性があります...しかし、それはすべきではありません案件。(残りのコンテキストは引き続き伝搬されます。)

非同期メソッドが完了せずに戻っても問題ないことに注意してください。非同期メソッドは値を直接返すことができないため、常にTask<T>(またはTask、またはvoid)... を返し、メソッドによって返されるタスクは完了するだけです。非同期メソッドが本当に最後に達したとき。

于 2012-09-01T13:02:23.590 に答える
3

いいえ。現在のスレッドは実際にはスリープ状態になりません。実行は続行されます。これが全体のトリックです。非同期アクションがまだ保留中にデータを処理するコードがある場合があります。これは、これらの非同期処理が完了するまでに、メイン スレッドが自由に実行され、他のデータを処理できることを意味します。

質問の他の部分については、 async は現在のスレッドではなく、別のスレッドで実行されるだけです。CLR がこれらのスレッドのスピンを担当しているため、多くの非同期アクションが同時に許可されていると思います (つまり、異なる Web サーバーから同時に非同期でデータを取得している可能性があります)。

于 2012-09-01T13:02:58.143 に答える