什么时候在C#的接口方法中使用Task?

dpp*_*dpp 5 c# async-await

您显然知道async会有一些接口方法,例如将从磁盘读取的实现,您可以轻松决定使用Task。还有可能使用的接口方法async,您也可以使它们返回Task

我不禁看到Task作为一个实现细节,我很犹豫,把Task我的接口时,我不知道,如果实施将async/将使用async的方法。如果我决定不使用Task,则async在需要时不能使用实现方法。

尽管根据实现的要求调整合同感觉很奇怪,但这是我要做的。这是正确的方法吗?

Gab*_*uci 6

这是正确的方法吗?

是。仅Task当您知道有时会有异步的机会时使用。

这仍然给您留下了机会,因为接口不需要使用async- 接口只能要求Taskor 的返回类型Task<T>

如果最终不需要执行任何异步操作,则可以使用Task.FromResult()返回Task带有值的完成值。例如:

protected override Task<int> SomeMethod() {
    return Task.FromResult(1);
}
Run Code Online (Sandbox Code Playgroud)

或者,Task.CompletedTask如果没有返回值。

否则,如果您未指定Task返回类型,而要异步执行操作,则有两个选择:

  1. 在实现中使用同步方法,
  2. 如果没有同步方法可用于您想做的事情(这越来越普遍),那么您要么必须:
    • 异步阻止异步方法,或者
    • 使用async void(如果方法返回void),这可能会导致其他并发症。

Task在不需要异步运行的情况下,所有这些都比返回完成的方法更糟糕。