非同期プログラミング:
および潜在的なデッドロックとの比較await
Task.WaitAll
と
Task.Wait
このシーンでは、「GET」メソッドにはデッドロックがあると予想されます。基本的な理由は何ですか? await
ではなく、妨害と待機を使用することの違いは何ですか?
<code class="language-csharp">public async Task<string> Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task<string> Bar() { return await Foo(); } public async static Task<string> Ros() { return await Bar(); } public IEnumerable<string> Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray()); return new string[] { "value1", "value2" }; // 由于死锁而从未执行 }</code>
およびawait Task.Delay
およびWait
同様の概念的役割を想定していますが、それらの機能は異なります。 await
タスクが完了するまで現在のスレッドをブロックします。この方法は、スレッドプールに飢えているため、お勧めできません。
それどころか、メソッドを実行するために非同期が一時停止されます。メソッドの現在の状態がキャプチャされ、この方法は未完成のタスクを発信者に返します。タスクが完了すると、メソッドの残りの部分は継続としてスケジュールされます。
Task.Wait
潜在的な死んだロックと非同期ミッションawaitを呼び出します。これにより、実行が停止されます。その結果、タスクは完了しておらず、スレッドはTask.Wait
コールでまだブロックされていました。これにより、死んだロックが発生します。
非同期プログラミングを使用して、死んだロックを避けるとawait
キーワードの使用を組み合わせることにより、コードは応答能力を維持し、死んだロックを防ぐことができます。
以上がAsyncプログラミング: `task.waitall`デッドロック:何がそれを引き起こし、「待ち望まれている」とどのように違いますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。