118

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

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

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

収量:

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

4

17 に答える 17

121

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

メソッドが戻る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;
}

ヘルパークラスは、同じリターンタイプの各メソッドがオブジェクトを共有できるため、GCが収集しなければならないガベージも削減しTaskますNotImplementedException

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

于 2012-11-06T16:00:50.943 に答える
73

関数の本体をシンプルに保ち、それをサポートするコードを記述しない場合の別のオプションは、#pragma を使用して警告を抑制することです。

#pragma warning disable 1998
public async Task<object> Test()
{
    throw new NotImplementedException();
}
#pragma warning restore 1998

これが十分に一般的である場合は、disable ステートメントをファイルの先頭に置き、restore を省略できます。

http://msdn.microsoft.com/en-us/library/441722ys(v=vs.110).aspx

于 2013-04-17T18:02:58.980 に答える
44

async キーワードを保持する別の方法 (保持したい場合) は、次を使用することです。

public async Task StartAsync()
{
    await Task.Yield();
}

メソッドに入力したら、ステートメントを簡単に削除できます。メソッドが何かを待機している可能性があるが、すべての実装が実際に待機しているわけではない場合は特に、これをよく使用します。

于 2014-07-23T15:59:33.903 に答える
9

TaskConstantsStephen's Answer の更新と同様に、新しいヘルパー メソッドがあるため、クラスを記述する必要がなくなりました。

    public Task ThrowException()
    {
        try
        {
            throw new NotImplementedException();
        }
        catch (Exception e)
        {
            return Task.FromException(e);
        }
    }
于 2016-11-17T10:52:40.887 に答える
3

Reactive Extension に対して既にリンクしている場合は、次のこともできます。

public async Task<object> NotImplemented()
{
    await Observable.Throw(new NotImplementedException(), null as object).ToTask();
}

public async Task<object> SimpleResult()
{
    await Observable.Return(myvalue).ToTask();
}

Reactive と async/await は、それ自体が素晴らしいだけでなく、一緒に使うこともできます。

必要なものは次のとおりです。

using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;
于 2013-04-08T18:14:14.673 に答える
-3
// This is to get rid of warning CS1998, please remove when implementing this method.
await new Task(() => { }).ConfigureAwait(false);
throw new NotImplementedException();
于 2016-08-22T15:21:43.787 に答える