次の状況で何が起こるかを誰かが私に説明できますか?
public int? getValue()
{
return GetIntValue().Result;
}
public async Task<int?> GetIntValue()
{
return await getId();
}
public async Task<int?> getId()
{
return (await Context.Users.FirstOrDefaultAsync())?.AssignedUserId;
}
そして、この状況が異なる場合:
public int? getValue()
{
return getId().Result;
}
基本的に、ここで待機すると、どちらか(または両方の場合)で結果が返される前に実行が続行されるのではないかと思います。それらが異なる場合、なぜ異なるのでしょうか。
これgetId().Result;
はブロッキング呼び出しであり、デッドロックシナリオが発生する可能性があります。現在の実行スレッドは、呼び出された関数が戻るまでブロックされます。
一方、async/await
アプローチを使用すると、ブロックされません。この呼び出しを処理するスレッドは停止し、別の呼び出しを処理できるようになります。次に、関数呼び出しが完了すると、結果はスレッドプールの別のスレッドによって処理されます。
上記のブロッキング呼び出しがアプリケーションにどのように影響するかは、アプリケーションのタイプによって異なります。たとえば、WindowsフォームアプリケーションまたはWPFアプリケーションについて話しているときに、このコードがUIスレッドで実行されると、この呼び出しが完了するまでフォームがフリーズします。一方、これがASP.NETアプリケーションであり、サーバーに多数の要求がヒットしている場合、サーバーが受信する要求を処理することを目的としたASP.NETスレッドが使い果たされる可能性があります。明らかに、これにより、サーバーが受信した要求の一部が応答を取得するまで、アプリケーションが新しい要求に応答しなくなります。
デッドロックのシナリオについては、この質問、特に最初の回答をご覧ください。これには、このトピックに関する優れた記事へのリンクがあります。非同期コードでブロックしないでください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加