1. ホーム
  2. c#

[解決済み] 警告 CS1998 を抑制する。この非同期メソッドには 'await' がありません。

2022-09-04 18:26:39

質問

を返すいくつかの関数を持つインタフェースがあります。 Task . このインターフェイスを実装しているクラスの中には await するものがないものもあれば、単に throw するものもあり、そのため警告は無意味で迷惑なものです。

これらの警告を抑制することは可能でしょうか?例えば

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

の収量。

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

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

<ブロッククオート

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

を返すメソッド Task , 私は信じています。 async は実装の詳細なので、インターフェースメソッドに適用することはできません。

インターフェイスを実装しているクラスの中には、awaitするものがないものもありますし、ただ投げるだけのものもあるかもしれません。

このような場合は、以下のように 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;
}

ヘルパークラスは、GC が収集しなければならないゴミも減らします。 TaskNotImplementedException オブジェクトを作成します。

他にもいくつか タスク定数タイプの例が私の AsyncEx ライブラリにあります。 .