C# 'のAsync/await
のデッドロックを理解し、防止します c# 'sasync
/await
は非同期プログラミングを簡素化しますが、不適切な使用はデッドロックにつながる可能性があります。 一般的なシナリオを調べてみましょう:
<code class="language-csharp">public ActionResult ActionAsync() { // DEADLOCK: Blocking on the async task var data = GetDataAsync().Result; return View(data); } private async Task<string> GetDataAsync() { // Simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); }</code>
デッドロック:
メインスレッドで実行されているActionAsync
が同期してGetDataAsync
を使用して完了するのを同期的に待つため、デッドロックが発生します。 通常、.Result
はスレッドをリリースしますが、await
は同期待機を強制します。 重要なことに、.Result
はメインスレッドのコンテキスト内で実行されます。 GetDataAsync
sawait
の場合、コンテキストをキャプチャし、再開するのを待ちます。 しかし、メインスレッドはブロックされており、MyWebService.GetDataAsync
が終了しないようにします。 これは古典的なデッドロックです。メインスレッドはGetDataAsync
を待ちます。これは、メインスレッドがコンテキストをリリースするのを待ちます。
GetDataAsync
ソリューションは、
/を使用するときにスレッドを同期的にブロックすることを避けることです。 適切な継続を確実にするために、常にasync
メソッド内でawait
を使用してください。これにより、コンテキストスレッドのブロックを防ぎ、非同期操作が完了することができます。 修正されたコードは次のようになります:await
async
<code class="language-csharp">public async Task<ActionResult> ActionAsync() { // Correct: Awaiting the async task var data = await GetDataAsync(); return View(data); } private async Task<string> GetDataAsync() { // ... (remains unchanged) ... }</code>in
では、メインスレッドが非同期に実行されている間に他のタスクの処理を続けることを許可します。 これにより、デッドロックが排除されます。 メソッドは非同期操作として扱われ、await
。GetDataAsync
を使用してそれに応じて処理する必要があります
以上がAsync/待ち時間がC#でどのように発生するか、どのようにしてそれらを防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。