タスクを返さないでください.fromresultsまたはタスク.CompletedTask
それで、あなたは待ちます何かを持たないこのasyncハンドラまたはインタフェースメソッドを実行していて、あなたは何かを書きます
それでは、代わりに何をすべきですか?
つのオプションは警告CS 1998を無効にすることです、しかし、メソッドがちょうど最初に仕事を返すべきでないケースを指摘するかもしれません.おそらく、この関数は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.
Reference
この問題について(タスクを返さないでください.fromresultsまたはタスク.CompletedTask), 我々は、より多くの情報をここで見つけました https://dev.to/asik/dont-return-taskfromresult-or-taskcompletedtask-4gcpテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol