await
:デッドロックのルートTask.Wait
非同期プログラミングの違いはわずかに重要です。この記事では、2つの違いを調査し、一般的なデッドロックシーンを分析します。 await
Task.Wait
task.wait:同期ブロッキング
タスクが完了するまで、通話スレッドを同時にカバーします。これにより、本質的にスレッドが停止され、タスクが実行されるのを待ちました。
Task.Wait
対照的に、
死んだロックシーン
次のコードの例を考慮して、エラーがawait
を使用します。
メソッドが現在のスレッドをブロックし、コレクション内のすべてのタスクが完了するのを待っています。ただし、各メソッドには、その実行を吊るす式が含まれています。
呼び出しスレッドがでブロックされている場合、タスクのTask.Wait
式は完了できません。これは、タスクが完了しない限り、呼び出しスレッドが障害物を解放することができない場合を除き、タスクを実行し続けることができないため、デッドロックを生成します。
<code>Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());</code>なぜブロックが死んだロックを避けるのを待っているのか
Task.WaitAll
Ros()
await
やロックなどの閉塞待機を使用して、このシーンでは、タスクが個別のスレッドで実行されるのを防ぐことができないため、死んだロックを引き起こしません。妨害の待機は、遅延コールメソッドの実行にすぎないため、タスクを続行して最終的に完了できます。
結論Task.WaitAll
await
との違いを必ず理解してください。一般的に言えば、は常に非同期コードで使用され、呼び出しスレッドが維持されるようにします。
以上が待っている対task.wait:なぜtask.waitを使用するとデッドロックを引き起こすのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。