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」を要求します(これは戻り値を持つメソッドに対してのみ機能します)。それが私が克服しようとしていることです。
次の方法で:
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]
コメントを追加