说我有一个界面
interface IFoo {
Task SomeMethodAsync();
}
我想实现这个接口,但对于一个类,该方法是空白的。
我应该接受这产生的警告吗?
async Task SomeMethodAsync() {}
或者我应该让它返回一些虚拟任务?
async Task SomeMethodAsync() { await Task.Run(() => {}); }
或者还有其他选择吗?
另外,我想将此方法实现为显式接口方法。这会有什么不同吗?
答案 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
关键字是必需的。