如何在空接口方法上使用async

时间:2012-08-28 11:30:56

标签: c# asynchronous syntax

说我有一个界面

interface IFoo {
    Task SomeMethodAsync();
}

我想实现这个接口,但对于一个类,该方法是空白的。

我应该接受这产生的警告吗?

async Task SomeMethodAsync() {}

或者我应该让它返回一些虚拟任务?

async Task SomeMethodAsync() { await Task.Run(() => {}); }

或者还有其他选择吗?

另外,我想将此方法实现为显式接口方法。这会有什么不同吗?

3 个答案:

答案 0 :(得分:14)

返回Task的方法不一定是async

我会推荐这样的东西:

Task IFoo.SomeMethodAsync()
{
  return Task.FromResult(true);
}

我假设如果这是一个同步方法,你只需要一个空的方法体;这是空方法体的async等价物。

答案 1 :(得分:2)

这只取决于你如何决定框架必须处理这种情况。

你有,imo,有几种选择:

  • 引发异常(将中断执行,你必须在执行链的某个地方以某种方式处理)。

  • 返回default-value(这可能是您提供的解决方案:只是一个没有做任何事情的空任务。不好这就是我称函数期待它做了什么,它没有通知我任何事情,但也没有做任何事情.Imo,这是糟糕的设计。

  • 返回一些not-valid-value,由调用者截获,因此调用者“知道”某些内容不正常

答案 2 :(得分:1)

我遇到了一个抽象基类。我尝试了Stephen Cleary的方法,但在C#6中遇到了编译错误。

我的基本方法的一个例子:

protected abstract Task OnFoo(Bar bar);

这是我在派生类中必须做的事情:

protected override async Task OnFoo(Bar bar)
{
    await Task.FromResult(true);
}

另一个答案的问题是短语中的return关键字。由于Task的返回值基本上为void,因此您无法返回任何内容。此外,await关键字是必需的。