非同期であり、呼び出し元が非同期ではなく、呼び出されたメソッドが非同期である場合に待機します

アレックス

次の状況で何が起こるかを誰かが私に説明できますか?

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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ