30

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

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

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

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

戻り値の型が「タスク」であることを考えると、これは少し珍しいことです。この問題はイライラするものであり、継続スタイルを使用するか、このインターフェイスの周りに追加のプロキシを提供することで「フォールバック」する必要があります (したがって、ほとんどすべてのインターフェイスについて、実際には実現できません)。

誰もこれを解決する方法について良い考えを持っていますか?

4

3 に答える 3

31

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

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

class Bar
{
    static async Task AsyncMethod() // marked as async!
    {
        IFoo x;
        await x.AwaitableMethod();
    }
}
于 2012-09-25T11:17:38.983 に答える
12

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

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); 
 }
于 2012-09-25T11:14:41.417 に答える
-1

コンパイラ メッセージは、インターフェイスでの使用法ではありません。これは、操作で適切な待機が発生したときにランタイムによって実装されるタスクの非同期要求です。

使用法はメソッドの実装である必要があります。クラス; インターフェイスの使用法は、インターフェイスのセッターとゲッターの場合と同じです。

于 2012-10-25T10:02:22.960 に答える