最初のawait
が呼び出される前に、非同期メソッドの開始時に高価なコードを作成するのは悪いですか?代わりにTaskEx.Run
でこのコードをラップする必要がありますか?非同期メソッドは最初の 'await'の前に高価なコードを持つことができますか?
8
A
答えて
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
でした)に移動すると、この場合に有益です。
関連する問題
- 1. 最後に待つ前に非同期メソッドから戻ることはできますか?
- 2. 非同期メソッドの非同期メソッド
- 3. のawait /非同期
- 4. 初期化は非同期メソッド(xamarin.forms)を待つことはありません
- 5. 非同期メソッドは、私は現在、このようなコード持っている非非同期
- 6. パススルー非同期メソッドは本当にawait/asyncパターンを必要としますか?
- 7. OWIN認証:非同期メソッドに 'await'オペレータがありません
- 8. 非同期Awaitハンドラデッドロック
- 9. 非同期メソッドから戻ることができません
- 10. 非同期Awaitパラメータ付きメソッドの問題
- 11. 非同期メソッドでコードをデバッグできないのはなぜですか?
- 12. この親メソッドで非同期修飾子を使用せずに非同期メソッドを待つことはできますか?
- 13. 非同期メソッド非同期に新
- 14. 「非同期メソッドはvoidを返さない」というコードをリファクタリングすることはできますか?
- 15. この非同期アクター初期化イディオムの名前はありますか?
- 16. シンプルなC#Async Await - 非同期にプロセスリスト
- 17. 既存のC#同期メソッドをasync/awaitと非同期に変換しますか?
- 18. のXmlWriter非同期メソッド
- 19. 非同期コードから非同期メソッドを呼び出す
- 20. 非同期メソッドは、私は下に次のコード持って
- 21. 同じ名前のGETとPOSTの両方の非同期コントローラアクションを持つことは可能ですか?
- 22. fdsinkの高速起動:最初の5MBの非同期、同期後のバイト数
- 23. 非同期ループ内の非同期メソッド
- 24. GWT非同期データプロバイダは、いつも私が持つ単純なcelltableを持ってceltable」最初のページ
- 25. Firebase Firestore get()は非同期/のawait
- 26. 同期または非同期応答を持つことができるAPIを設計する方法
- 27. 非同期メソッドでawaitを使用する場合、どのようにタスクオブジェクトにアクセスできますか?
- 28. 非同期メソッドを同期する
- 29. 移動非同期メソッドが返す前に、私は、この非同期メソッドの前に別のContentPageを開始する必要がある値
- 30. getingエラー: 'awaitは非同期メソッドまたはラムダ式内の識別子として使用できません'
例を擬似コードすることはできますか? – vcsjones