.NET 4.5 非同期タスクのデッドロック: 結果プロパティへのアクセス
この記事では、.NET 4.5 アプリケーションの一般的な問題、つまり Result
プロパティにアクセスすると非同期タスクがハングするという問題に対処します。 この問題は通常、相互接続された非同期メソッドと同期 UI メソッドが関係するシナリオで発生します。 SQL クエリが完了し、ラムダ関数が終了した場合でも、スレッドは非同期メソッド内の Result
行でブロックされたままになる可能性があります。
犯人: SynchronizationContext とデッドロック
根本的な原因は、多くの場合、SynchronizationContext
に起因するデッドロックです。 UI アプリケーションでは、通常、タスク並列ライブラリ (TPL) が非同期メソッドの継続を元のスレッドに戻すようにスケジュールします。 非同期呼び出しが UI スレッドから発信され、そのスレッドが Result
の待機中にブロックされている間に継続が UI スレッドに戻ろうとすると、デッドロックが発生します。
非同期デッドロックを回避するソリューション
このデッドロックを解決するには、いくつかのアプローチがあります。
1. await
は避けてください (単純な場合):
戻り値が 1 つだけの単純なメソッドの場合は、async
キーワードと await
キーワードを削除することを検討してください。 代わりに、Task
オブジェクトを直接渡します。
2. スレッドプールのスケジュールを強制する:
ConfigureAwait(false)
を使用して、SynchronizationContext
をバイパスして、スレッド プールのスレッドにタスクの継続を明示的にスケジュールします。 重要なのは、これをすべての依存メソッド全体に伝播して、カスケード デッドロックを防ぐことです。
3. マインドフル await
使用法:
await
を使用する場合、特に UI スレッドと対話する場合は、コンテキストと潜在的なデッドロック シナリオを慎重に考慮してください。 UI スレッドの Result
プロパティにアクセスするなど、ブロック操作を直接呼び出すことは避けてください。 代わりに、適切な非同期パターンを使用してタスクの完了を処理します。
以上が.NET 4.5 アプリケーションで結果アクセス時に非同期タスクがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。