非同期プログラミングにおけるawait Task.Run(); return;
とreturn Task.Run()
の間の重要な違いと異常な治療への影響
概念の違い
2つのコードフラグメントの主な違いは、異常な通信です。 「」バージョンはタスクを待っていないため、スローされた異常はキャプチャされませんが、すぐにコールに投げます。
コード生成await Task.Run(); return;
return Task.Run();
異常な治療
次の例を考えてみましょう
await Task.Run(); return;
return Task.Run();
」バージョンは例外をスローします。ただし、に電話すると、例外はすぐにスローされます。 (関数が異常に適切に処理されているとします)。 非同期voidメソッド
非同期void法の場合、異常な通信の論理は異なります。それが存在する場合、非同期ボイド法に投げられた異常は、現在のスレッドのコンテキストで捨てられます。それ以外の場合、それらはにスローされ、発信者は同じスタックフレームでそれらを処理できません。
<code class="language-csharp">static async Task OneTestAsync(int n) { await Task.Delay(n); } static Task AnotherTestAsync(int n) { return Task.Delay(n); }</code>
シミュレーション非同期異常播種DoTestAsync(OneTestAsync, -2)
await
DoTestAsync(AnotherTestAsync, -2)
テクニックを使用して、非同期方法の異常なコミュニケーション挙動をシミュレートできます。
DoTestAsync
この例では、異常はタスク内にスローされ、
オブジェクトに広がります。 死んだロックの可能性
ThreadPool.QueueUserWorkItem
非同期/待機バージョンは、非デフォルト同期コンテキストで発生しやすくなります。たとえば、次のコードはWinformsまたはWPFアプリケーションで発生します。
要するに、
は構造化された異常な治療を提供し、await Task.Run(); return;
はコールパーティに異常を直接投げます、そして、コールパーティはそれ自体で処理する必要があります。選択する方法は、異常な処理戦略とプログラムのコンテキストに依存します。 return Task.Run();
バージョンはより安全ですが、潜在的なデッドロックの問題を考慮する必要がありますが、異常な処理にはより注意が必要です。 await
以上が`await task.run()の重要な違いは何ですか。 return; `および` return task.run() `in c#asyncプログラミングで、これは例外処理にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。