在不返回void,Task或Task <T>的方法中等待某事的正确方法?

KDe*_*ker 2 c# asynchronous task-parallel-library async-await

假设我正在使用方法签名实现接口

String FooBar();
Run Code Online (Sandbox Code Playgroud)

后来我在课堂上实现了这个界面

public String FooBar()
{
    return "";
}
Run Code Online (Sandbox Code Playgroud)

但在某些时候我想要await一些东西

public async Task<String> FooBar()
{
    await Task.Delay(500);
    return "";
}
Run Code Online (Sandbox Code Playgroud)

如何await在这种情况下无需改变方法签名即可

Task<String> FooBar();
Run Code Online (Sandbox Code Playgroud)

是这样做的正确方法Task.WaitAll吗?或者是否有更受欢迎的模式?

编辑:我不认为我的问题是完全重复,虽然非常相关,我将如何同步运行异步Task <T>方法?.我比如何调用async函数更担心如何实现接口.但我承认粗体问题确实等同于重复的问题.

我确实看到,Task因为接口调用async方法的实现者的可能性,返回更合适.否则我会把它们"锁定"这样做.

Ste*_*ary 5

如何在不必更改方法签名的情况下等待此方案中的某些内容

适当的解决方案是改变方法签名.任何可以异步实现的接口方法应该返回Task/ Task<T>.

(从设计角度来看,这与决定接口是否应该派生出来非常相似IDisposable- 接口必须预测其自己的实现细节).

至于不正确的解决方案,这只是"从同步方法调用异步方法"问题的另一种变体.没有理想的,通用的或普遍接受的解决方案.你可以做的只有几个黑客,每个都有不同的缺点.我在异步棕色文章中介绍了这些内容.