12

说我有一个界面

interface IFoo {
    Task SomeMethodAsync();
}

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

我应该忍受由此产生的警告吗?

async Task SomeMethodAsync() {}

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

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

或者还有其他选择吗?

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

4

3 回答 3

14

返回的方法Task不必是async.

我会推荐这样的东西:

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

我假设如果这是一个同步方法,那么您将只有一个空方法体;这async相当于一个空的方法体。

于 2012-08-28T12:51:25.623 回答
2

这仅取决于您如何决定框架必须处理此类情况。

imo,您有几个选择:

  • 引发异常(将立即中断执行,您必须在执行链中的某个位置以某种方式处理它)。

  • return default-value(这可以是您提供的解决方案:只是一个不做任何事情的空任务。不好的是我调用函数期望它做某事,它不会通知我任何事情但也不做任何事情。 Imo,这是糟糕的设计。

  • return some not-valid-value,它被调用者拦截,所以调用者“知道”某些事情是不正常的。

于 2012-08-28T11:38:23.147 回答
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关键字是必需的。

于 2016-06-15T14:58:29.227 回答