2017-05-09 4 views
3

に再開:タスク<TResult> .ConfigureAwait(偽)は、私は、コードのブロックの下有する捕捉コンテキスト

Task task2Seconds = Wait2Seconds(); 
Task task5Seconds = Wait5Seconds(); 

await task5Seconds; 
await task2Seconds.ConfigureAwait(false); 
  1. 最初のタスクが同一の(捕捉)コンテキストに再開すると考えられる待つ、それは5を取り秒。
  2. 2番目のタスクは、キャプチャされたコンテキストで再開しないように設定されており、2秒かかるだけです。
  3. 結果は2番目のタスクが待機した後で、キャプチャされたコンテキストで再開します。

私は基本的な論理を理解できません、誰も私に説明することができますか?あなたがConfigureAwait(false)を呼び出すと

おかげ コイ

答えて

5

は、あなたがawait後に実行を再開する場合、フレームワークは同じコンテキストで実行を再開するためにを必要ではないことを.NETを語っています。しかしそれはフレームワークにであることを伝えることと同じではなく、同じ文脈ででなくを再開することと同じではありません。

あなたの2番目のawaitはすでに完了しているタスクを待っています。このように、継続は、即座かつ同期的に、すなわちスレッドの制御を放棄することなく実行することができる。したがって、あなたのコードはその場合に同じコンテキストにとどまります。

awaitがあなたを元のコンテキストに戻しているわけではありません。むしろ、それはその文脈を離れる理由がないことだけであるので、awaitが完了するとまだそこにいる。

+0

いいですね! – Khoi

+0

@EmrahSüngüどこですか? – Khoi

+0

@Khoi:どちらも正しいわけではないので、彼は彼の答えを削除しました。彼はあなたのコードで何が起こっているのか誤解していました。 –