Task.Result プロパティでブロックされた C# 非同期操作: デッドロックの詳細な説明
C# の async および await キーワードを使用した非同期プログラミングでは、混乱を招く動作が発生することがあります。この記事では、非同期操作がタスクの Result プロパティで停止するシナリオについて詳しく説明します。
問題の説明
開発者は、データの取得に非同期メソッドを使用する従来の 3 層アプリケーションでこの問題に遭遇しました。 ExecuteAsync
メソッドはスレッド プール スレッドで SQL 操作を開始し、後続のメソッド GetTotalAsync
は await を使用して結果にアクセスします。ただし、UI メソッドが非同期タスクの Result プロパティにアクセスすると、アプリケーションがフリーズします。
根本原因: デッドロック
問題の根本は、タスク並列ライブラリ (TPL) を使用する際の一般的なエラーにあります。デフォルトでは、ランタイムは最初にメソッドを起動したのと同じ SynchronizationContext 上で関数の継続をスケジュールします。ほとんどの場合、この動作は理想的です。ただし、操作が UI スレッドで開始され、その後 Result の呼び出しによってブロックされると、デッドロックが発生する可能性があります。
解決策
デッドロックを解決するには、いくつかの方法があります:
.ConfigureAwait(false)
を追加すると、呼び出しコンテキストに関係なく、継続が常にスレッド プールでスケジュールされるようになります。 その他の注意事項
以上がタスクの結果プロパティにアクセスすると非同期 C# アクションがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。