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

C# 如何在空接口方法上使用async,c#,asynchronous,syntax,C#,Asynchronous,Syntax,假设我有一个接口 interface IFoo { Task SomeMethodAsync(); } 我想实现这个接口,但有一个类的方法是空的 我应该接受这样的警告吗 async Task SomeMethodAsync() {} 或者我应该让它返回一些虚拟任务 async Task SomeMethodAsync() { await Task.Run(() => {}); } 还是有其他选择 我还想将此方法实现为显式接口方法。这会有什么不同吗?这只取决于您如何决定框架必须

假设我有一个接口

interface IFoo {
    Task SomeMethodAsync();
}
我想实现这个接口,但有一个类的方法是空的

我应该接受这样的警告吗

async Task SomeMethodAsync() {}
或者我应该让它返回一些虚拟任务

async Task SomeMethodAsync() { await Task.Run(() => {}); }
还是有其他选择


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

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

国际海事组织,你有几个选择:

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

  • 返回
    默认值
    (这可能是您提供的解决方案:只是一个不做任何事情的空任务。糟糕的是,我调用函数期望它做一些事情,它不通知我任何事情,但也不做任何事情。依我看,这是糟糕的设计

  • 返回一些
    无效值
    ,该值被调用者截取,以便调用者“知道”某些内容不正常


返回
任务的方法不必是
异步的

我想推荐如下:

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

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

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

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

protected abstract Task OnFoo(Bar bar);
这是我在派生类中必须做的:

protected override async Task OnFoo(Bar bar)
{
    await Task.FromResult(true);
}
另一个答案的问题是短语中的
return
关键字。由于
Task
的返回值本质上是
void
,因此不能返回任何内容。此外,还需要
wait
关键字。

可能重复的