警告を抑制 CS1998: この非同期メソッドには 'await' がありません 質問する

警告を抑制 CS1998: この非同期メソッドには 'await' がありません 質問する

を返す関数がいくつかあるインターフェースがありますTask。インターフェースを実装するクラスの中には、待機するものが何もないものもあれば、単にスローするだけのものもあるため、警告は不必要で迷惑です。

これらの警告を抑制することは可能ですか? 例:

public async Task<object> test()
{
    throw new NotImplementedException();
}

結果:

警告 CS1998: この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。 'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を使用してバックグラウンド スレッドで CPU バウンド作業を実行することを検討してください。

ベストアンサー1

いくつかの非同期関数を持つインターフェースがあります。

を返すメソッドはTask実装asyncの詳細であるため、インターフェース メソッドには適用できません。

インターフェースを実装するクラスの中には、待機するものがないものもあり、単にスローするものもあるかもしれません。

asyncこのような場合、実装の詳細であるという事実を活用できます。

何もしない場合はawait、次のように返しますTask.FromResult

public Task<int> Success() // note: no "async"
{
  ... // non-awaiting code
  int result = ...;
  return Task.FromResult(result);
}

投げる場合NotImplementedException、手順は少し長くなります。

public Task<int> Fail() // note: no "async"
{
  var tcs = new TaskCompletionSource<int>();
  tcs.SetException(new NotImplementedException());
  return tcs.Task;
}

スローするメソッドが多数ある場合NotImplementedException(それ自体が、設計レベルのリファクタリングが適切であることを示している可能性があります)、冗長な部分をヘルパー クラスにまとめることができます。

public static class TaskConstants<TResult>
{
  static TaskConstants()
  {
    var tcs = new TaskCompletionSource<TResult>();
    tcs.SetException(new NotImplementedException());
    NotImplemented = tcs.Task;
  }

  public static Task<TResult> NotImplemented { get; private set; }
}

public Task<int> Fail() // note: no "async"
{
  return TaskConstants<int>.NotImplemented;
}

Taskヘルパー クラスでは、同じ戻り値の型を持つ各メソッドがそのオブジェクトを共有できるため、GC が収集する必要のあるガベージも削減されますNotImplementedException

他にもいくつかあります私の AsyncEx ライブラリの「タスク定数」型の例

おすすめ記事