2011-12-09 5 views

答えて

10

Reedが述べているように、実際にはコンテキストに依存します。コードはのところでポイントで実行する必要がありますが、コンテキストによっては、重要なスレッドスレッドではなくスレッドプールスレッドで実行される可能性があります。

むしろTask.Runを使用するよりも、私はTaskEx.Yieldを使用したい:

public async Task Foo() 
{ 
    await TaskEx.Yield(); 
    // Do expensive stuff 
} 

を限り、私は承知しているとして、それは基本的にすぐに非同期メソッドの残りの部分を、呼び出し元に戻るが、許可の方法ですすぐに予定される。 WindowsフォームUIスレッドのようなものであれば、すぐにUIスレッドに戻って(そこでは高価なコードを実行しているので)、これを行う必要はありませんが、コンテキスト内であれば意味があります現在のスレッドをブロックすべきではないが、継続は別のスレッドで実行される。

5

これは必ずしも悪いわけではありませんが、予期しない結果になる可能性があります。呼び出し側がコードが完全に非同期に動作することを期待すると、高価なコードが同期して実行されます。これにより、部分的には同期メソッドのように振る舞いますが、非同期的にも動作しますが、両方の世界の中で最悪のものです(非同期からの余分な複雑さ)。

可能であれば、最初の待望の「高価な」コードではありません。高価なコードをラップするためにTask.Run(またはCTPのTaskEx.Run)を使用するか、高価なコードを独自の非同期メソッド(awaitでした)に移動すると、この場合に有益です。

関連する問題