1. ホーム
  2. c#

[解決済み] この非同期メソッドは'await'演算子を持たないため、同期的に実行されます」という警告を気にする必要があるか?

2022-08-04 05:12:54

質問

いくつかの非同期メソッドを公開するインターフェイスがあります。より具体的には、以下のいずれかを返すメソッドが定義されています。 Task または Task<T> . async/awaitキーワードを使用しています。

私はこのインターフェイスを実装している最中です。しかし、これらのメソッドのいくつかで、この実装はawaitするものを持ちません。そのため、コンパイラの警告 "CS1998.This async method lacks 'await'を受けています。この非同期メソッドは 'await' 演算子を欠いており、同期的に実行されます..."。

なぜこのような警告が出るのかは理解しているのですが、このような状況で警告に対して何かすべきなのか悩んでいます。コンパイラの警告を無視するのは間違っているような気がします。

を待つことで修正できることは知っています。 Task.Run で待つことで解決できることは知っていますが、それは安価な操作を数回行うだけのメソッドにとっては間違っているように感じます。また、実行に不必要なオーバーヘッドを追加してしまうような気もするのですが、その場合は async キーワードが存在するからです。

警告を無視すればよいのでしょうか、それとも私が見ていないところでこれを回避する方法があるのでしょうか。

どのように解決するのですか?

この 非同期 キーワードは単にメソッドの実装の詳細であり、メソッドのシグネチャの一部ではありません。もしある特定のメソッドの実装やオーバーライドに待ち受けるものがなければ、単に async キーワードを省略し、完了したタスクを タスク.FromResult<TResult> :

public Task<string> Foo()               //    public async Task<string> Foo()
{                                       //    {
    Baz();                              //        Baz();
    return Task.FromResult("Hello");    //        return "Hello";
}                                       //    }

もしあなたのメソッドが タスク ではなく タスク<結果> とすれば、任意の型と値で、完了したタスクを返すことができます。 Task.FromResult(0) が一般的なようです。

public Task Bar()                       //    public async Task Bar()
{                                       //    {
    Baz();                              //        Baz();
    return Task.FromResult(0);          //
}                                       //    }

また、.NET Framework 4.6以降では、以下のように タスク.CompletedTask :

public Task Bar()                       //    public async Task Bar()
{                                       //    {
    Baz();                              //        Baz();
    return Task.CompletedTask;          //
}                                       //    }