web-dev-qa-db-ja.com

インターフェイスのメソッドでawaitを使用する方法

awaitキーワードを使用し、Task <>を返すメソッドを持つインターフェイスを持つ場合(モック、リモーティング、または類似のため)、インターフェイスに対して実装する場合:

interface IFoo
{
    Task<BigInteger> CalculateFaculty(int value);
}

コンパイラはエラーを出します:

'await'演算子は、非同期メソッド内でのみ使用できます。このメソッドを「async」修飾子でマークし、その戻り値の型を「タスク」に変更することを検討してください

戻り値の型が「タスク」であることを考えると、これは少し珍しいことです。この問題は一種の苛立たしいものであり、継続スタイルを使用するか、このインターフェイスの周りに追加のプロキシを提供することを強制します(したがって、ほとんどすべてのインターフェイスで、実際には実行可能ではありません)。

誰かがこれを解決する方法について良いアイデアを持っていますか?

29
Thomas Zeman

メッセージはインターフェースに関するものではなく、呼び出しメソッドに関するものです。 awaitキーワードを含むメソッドにasync修飾子を付ける必要があります。

public interface IFoo
{
    Task<int> AwaitableMethod();
}

class Bar
{
    static async Task AsyncMethod() // marked as async!
    {
        IFoo x;
        await x.AwaitableMethod();
    }
}
30
jeroenh

これは問題ないはずです:

interface IFoo
{
    Task<BigInteger> CalculateFaculty(int value);
}

public class Foo: IFoo
{
  public async Task<BigInteger> CalculateFaculty(int value)
  {
    var res =  await AsyncCall();
    return res;
  }
}

使用法:

 public async Task DoSomething(IFoo foo) 
 { 
   var result = await foo.CalculateFaculty(123); 
 }
11
Anton Sizikov