如何在接口中使用await方法

时间:2012-09-25 11:12:02

标签: c# .net-4.5 async-await

使用 await 关键字实现对接口(由于模拟,远程处理或类似),并且具有返回任务<>的方法的接口:

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

编译器出现错误:

  

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

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

有没有人对如何解决这个问题有个好主意?

3 个答案:

答案 0 :(得分:30)

消息不是关于接口,而是关于调用方法。您需要使用await修饰符标记包含async关键字的方法:

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

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

答案 1 :(得分:11)

这一定是好的:

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); 
 }

答案 2 :(得分:-1)

编译器消息不在接口上的用法上。它是对运行时遇到适当的await的任务的异步请求。

用法应该是方法实现,即。班级;接口使用情况与接口中的setter和getter相同。