asyncメソッドの最後の非同期呼び出しは待機する必要がありますか?

アレックス

asyncメソッドの呼び出しがasyncメソッドの最後の呼び出しであるときに、awaitステートメントが必要かどうかがわかりません。例えば

public async Task CallAsync(byte[] data)
{
    await Call1Async(data);
    Call2Async(data);
}

public async Task Call1Async(byte[] data)
{
   ...
}

public async Task Call2Async(byte[] data)
{
   ...
}

上記はコンパイルされますが、「このメソッドに待機を適用することを検討してください」という警告が表示されます。しかし、メソッドの最後の呼び出しを待つために適用するのはリソースの無駄だと思います。

同時に、を使用するreturn Call2Async(data);代わりにを使用するとCall2Async(data);、警告が消えます。これはawait、そのような状況では実際には必要ないことを示しています。

ただし、これは戻り値を持つメソッドに対してのみ機能します(つまりTask<T>、だけではありませんTask)。戻り値のないメソッドにこれが必要です。値を返すメソッドについて同じことを行う方法はありますか?

つまり、の呼び出し元にTask返されCall2Asyncオブジェクトを何らかの方法で返す必要があり、メソッドに戻り値CallAsyncがないため、returnステートメントをCallAsync明示的に使用することはできませんもちろん、それらすべてを調整して値(たとえばtrue)を返すことはできますが、それは洗練された解決策ではありません。

PSメソッドに非同期呼び出しが1つしかない場合は、メソッドシグネチャに「async」を追加しないだけで機能します(「return」ステートメントは不要です)。ただし、メソッドに複数の非同期呼び出しが含まれている場合、最初の呼び出しを待機できるようにするには、「async」修飾子が必要です。「awaitCall1Async(data)」。また、「async」修飾子を追加すると、コンパイラーはTaskオブジェクトを呼び出し元に返すために「return」を要求します(これは戻り値を持つメソッドに対してのみ機能します)。それが私が克服しようとしていることです。

チームS。

次の方法で:

public async Task CallAsync(byte[] data)
{
    await Call1Async(data);
    Call2Async(data);
}

メソッドからの制御は、開始後に戻りますCall2Asyncつまり、もしあなたがそうするならawait CallAsync(data)、それは終わる前にCall2Async終わるでしょうこれはおそらくあなたが意図したものではありません。このメソッドは、両方の呼び出しが完了したときにのみ終了します。

public async Task CallAsync(byte[] data)
{
    await Call1Async(data);
    await Call2Async(data);
}

これらの出力例の違いを確認できます(開始を出力し、1秒間遅延してから、終了を出力する2つの非同期呼び出しを実装しました)。

void Main()
{
    Console.WriteLine("Main start");
    CallAsync(null).Wait();
    Console.WriteLine("Main end");
}

2番目のawaitプリントなしのメソッド

Main start
Call1Async start
Call1Async end
Call2Async start
Main end
Call2Async end

そして2番目とawait

Main start
Call1Async start
Call1Async end
Call2Async start
Call2Async end
Main end

この実装にも問題があります。

public Task CallAsync(byte[] data)
{
    Call1Async(data);
    return Call2Async(data);
}

両方の非同期呼び出しを同時に開始しますが、Call2Async完了したかどうかに関係Call1Asyncなく、完了したときに制御を返します繰り返しますが、これはおそらくあなたが意図したものではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#非同期ライブラリメソッドの呼び出しを待つ必要がありますか?

分類Dev

'async'コールグラフの最後の呼び出しは同期する必要がありますか?

分類Dev

「この非同期メソッドには「待機」演算子がなく、同期して実行される」と心配する必要がありますか?警告

分類Dev

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

分類Dev

割り込みメソッドの呼び出しを同期する必要がありますか?

分類Dev

非同期メソッド呼び出しは、すべてのメソッド呼び出しスコープでチェーンアップする必要がありますか?

分類Dev

asyncメソッドの最後に、戻るか待つ必要がありますか?

分類Dev

Task.RunはVB.NETの非同期メソッドをどのように呼び出す必要がありますか?

分類Dev

Pythonでは、super()は常にメソッドの最初に呼び出されます。後で呼び出す必要がある状況はありますか?

分類Dev

非同期メソッドを待つ必要がありますか?

分類Dev

C#での非同期呼び出しが、それらが存在するメソッドがすでに 'async'キーワードで宣言されているのに、そのように宣言する必要があるのはなぜですか?

分類Dev

非同期メソッドは、呼び出し時または待機時に例外をスローしますか?

分類Dev

Invokeメソッドの呼び出しは非同期ですか?

分類Dev

awaitなしで呼び出されたasyncメソッドのawaitsはまだ非同期ですか?

分類Dev

Jest:componentDidMountで.thenの非同期メソッドが呼び出されるのを待ちます

分類Dev

待機中のメソッドを呼び出すメソッドと通常のメソッドを呼び出すメソッドの2つのメソッドをリファクタリングする方法はありますか?

分類Dev

最後の非同期呼び出しを待つことと、それを返すこととの間に違いはありますか?

分類Dev

待機呼び出し後に合格する非同期NUnitテストメソッド

分類Dev

ある非同期呼び出しで返されたaccessTokenを別の非同期呼び出しでどのように使用する必要がありますか?

分類Dev

非同期呼び出し後のcudaFreeは機能しますか?

分類Dev

呼び出しAPIチェーンのすべてのメソッドでasync / awaitを使用する必要がありますか?

分類Dev

非同期ネストされたメソッドを呼び出す同期-非同期はパスの下で機能しますか?

分類Dev

非同期(待機)メソッドを同期的に呼び出す方法は?

分類Dev

C#からF#非同期メソッドを呼び出して待機しています

分類Dev

単体テストで非同期メソッドを同期的に呼び出すのは正しくありませんか?

分類Dev

メソッドが呼び出されることを確認するJavaの機能はありますか

分類Dev

Hangfire BackgroundJob.Enqueueメソッドを呼び出すときに非同期ラッパーを使用する必要がありますか?

分類Dev

内部メソッドは非同期である必要がありますが、外部メソッドは非同期である必要がありますか?

分類Dev

AsyncTaskからの静的メソッド呼び出しは非同期ですか?

Related 関連記事

  1. 1

    C#非同期ライブラリメソッドの呼び出しを待つ必要がありますか?

  2. 2

    'async'コールグラフの最後の呼び出しは同期する必要がありますか?

  3. 3

    「この非同期メソッドには「待機」演算子がなく、同期して実行される」と心配する必要がありますか?警告

  4. 4

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

  5. 5

    割り込みメソッドの呼び出しを同期する必要がありますか?

  6. 6

    非同期メソッド呼び出しは、すべてのメソッド呼び出しスコープでチェーンアップする必要がありますか?

  7. 7

    asyncメソッドの最後に、戻るか待つ必要がありますか?

  8. 8

    Task.RunはVB.NETの非同期メソッドをどのように呼び出す必要がありますか?

  9. 9

    Pythonでは、super()は常にメソッドの最初に呼び出されます。後で呼び出す必要がある状況はありますか?

  10. 10

    非同期メソッドを待つ必要がありますか?

  11. 11

    C#での非同期呼び出しが、それらが存在するメソッドがすでに 'async'キーワードで宣言されているのに、そのように宣言する必要があるのはなぜですか?

  12. 12

    非同期メソッドは、呼び出し時または待機時に例外をスローしますか?

  13. 13

    Invokeメソッドの呼び出しは非同期ですか?

  14. 14

    awaitなしで呼び出されたasyncメソッドのawaitsはまだ非同期ですか?

  15. 15

    Jest:componentDidMountで.thenの非同期メソッドが呼び出されるのを待ちます

  16. 16

    待機中のメソッドを呼び出すメソッドと通常のメソッドを呼び出すメソッドの2つのメソッドをリファクタリングする方法はありますか?

  17. 17

    最後の非同期呼び出しを待つことと、それを返すこととの間に違いはありますか?

  18. 18

    待機呼び出し後に合格する非同期NUnitテストメソッド

  19. 19

    ある非同期呼び出しで返されたaccessTokenを別の非同期呼び出しでどのように使用する必要がありますか?

  20. 20

    非同期呼び出し後のcudaFreeは機能しますか?

  21. 21

    呼び出しAPIチェーンのすべてのメソッドでasync / awaitを使用する必要がありますか?

  22. 22

    非同期ネストされたメソッドを呼び出す同期-非同期はパスの下で機能しますか?

  23. 23

    非同期(待機)メソッドを同期的に呼び出す方法は?

  24. 24

    C#からF#非同期メソッドを呼び出して待機しています

  25. 25

    単体テストで非同期メソッドを同期的に呼び出すのは正しくありませんか?

  26. 26

    メソッドが呼び出されることを確認するJavaの機能はありますか

  27. 27

    Hangfire BackgroundJob.Enqueueメソッドを呼び出すときに非同期ラッパーを使用する必要がありますか?

  28. 28

    内部メソッドは非同期である必要がありますが、外部メソッドは非同期である必要がありますか?

  29. 29

    AsyncTaskからの静的メソッド呼び出しは非同期ですか?

ホットタグ

アーカイブ