デバッグCheckStatusTwiceResultTest
デッドロック
この記事では、CheckStatusTwiceResultTest
ユニットテストで遭遇したデッドロックを分析します。 最初の3つのテスト(CheckOnceResultTest
、CheckOnceAwaitTest
、およびCheckStatusTwiceAwaitTest
)は正常に実行されますが、CheckStatusTwiceResultTest
ハングします。これは、Result
とawait
の使用に起因する問題を指します。
CheckStatus
andTask.Result
await
オブジェクトのプロパティは、タスクが完了するまで呼び出しスレッドをブロックします。 この例では、Result
は、非同期Task
メソッドの結果を同期して取得しようとします。非同期コンテキスト内のこの同期アクセスは、デッドロックの根本的な原因です。
CheckStatus().Result
CheckStatus
解決策:
ConfigureAwait(false)
タスクに同期してアクセスするときにデッドロックを防ぐには、を使用します。これにより、同期コールの継続が同じスレッドで発生し、潜在的なスレッドの競合が回避されます。 提供されたRestsharp拡張法(
を追加すると、デッドロックが解決される可能性があります。
ConfigureAwait(false)
ExecuteTaskAsync
推奨される慣行ConfigureAwait(false)
とを混合しないでください。 は非同期操作に最適ですが、
は同期コンテキストに適しています。この分離により、コードの明確さが向上し、デッドロックが防止されます 要するに、非同期操作内での誤った使用状況から、のデッドロックは発生します。 ベストプラクティスを採用し、await
を使用して戦略的に使用して、非同期プログラミングでこのようなデッドロックを排除します。
以上が「待ち望まれている」と「結果として」の両方を使用するときに、「CheckStatustWiceresultTest」のデッドロックがなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。