30

当使用await关键字实现接口(因为模拟、远程处理或类似)并具有返回 Task<> 方法的接口时:

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

编译器出现错误:

'await' 运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”

考虑到返回类型是“任务”,这有点不寻常。这个问题有点令人沮丧,并迫使我使用延续样式“回退”或围绕此接口提供额外的代理(因此对于几乎每个对我来说都不可行的接口)

有没有人知道如何解决这个问题?

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

编译器消息不在接口上的用法上。当在操作上遇到适当的等待时,它是由运行时实现的对任务的异步请求。

用法应该在方法实现上,即。班上; 接口用法与接口中的 setter 和 getter 相同。

于 2012-10-25T10:02:22.960 回答