タスクを返さないでください.fromresultsまたはタスク.CompletedTask


それで、あなたは待ちます何かを持たないこのasyncハンドラまたはインタフェースメソッドを実行していて、あなたは何かを書きます
async Task<bool> HandleAsync()
{
     DoSomethingSynchronous();
     return true;
}
しかし、現在C Chorseコンパイラは、厳しい警告を発します.さて、あなたは何も待つ必要はありませんが、まだタスクを返さなければなりません.あなたはasyncを削除し、代わりにasyncを返します.ジョブ完了.
Task<bool> HandleAsync()
{
    DoSomethingSynchronous();
    return Task.FromResult(true);
}
それともそれとも?Task.FromResult(true)が常に呼ばれて、すぐに待たれる限り、すべてはすばらしいです.
var success = await HandleAsync(); // This is fine.
しかし、暗い脅威は、影に潜んでいます.時々キャッチしようとすると例外をキャッチできません.
var task0 = a.HandleAsync();
var task1 = b.HandleAsync();

try
{
     await Task.WhenAll(new[] { task0, task1 });
}
catch (Exception ex)
{
    // this handler does nothing and the exception escapes! What gives??
}
HandleAsyncが実際に同期しているので、どんな例外もコールされるとすぐに伝播します.これはほとんどのC .タスクを返す同期メソッドは、特にsomeingasyncと呼ばれるとき、あなたが期待するものではありません.驚くべき、予期せぬ行動がバグにつながる.バグは不幸な顧客や開発者にもつながる.
それでは、代わりに何をすべきですか?
つのオプションは警告CS 1998を無効にすることです、しかし、メソッドがちょうど最初に仕事を返すべきでないケースを指摘するかもしれません.おそらく、この関数はasyncとしてマークし、HandleAsyncを待たなければならないでしょう.
async Task<bool> HandleAsync()
{
    DoSomethingNotAsync();
    return await Task.FromResult(true);
}
または、Task.FromResultを待っていて、Taskであるならば.
async Task HandlerAsync()
{
    DoSomethingNotAsync();
    await Task.CompletedTask;
}
これは遅いですか.完成したタスクを待つことはほとんど何もしません、そして、ランタイムはこの一般的なパターンを認識することができて、すべてのオーバーヘッドを引き出すことができるかもしれません.
実際、それは言う

warning CS1998: This async method lacks ‘await’ operators and will run synchronously. Consider using the ‘await’ operator to await non-blocking API calls, or ‘await Task.Run(…)’ to do CPU-bound work on a background thread.