【发布时间】:2015-05-09 21:06:48
【问题描述】:
假设我有一个包含异步方法的接口,并且该接口有两个不同的实现。这两种实现中的一种自然是异步的,而另一种则不是。实现非异步方法的“最正确”方式是什么?
public interface ISomething {
Task<Foo> DoSomethingAsync();
}
// Normal async implementation
public class Implementation1 : ISomething {
async Task<Foo> ISomething.DoSomethingAsync() {
return await DoSomethingElseAsync();
}
}
// Non-async implementation
public class Implementation2 : ISomething {
// Should it be:
async Task<Foo> ISomething.DoSomethingAsync() {
return await Task.Run(() => DoSomethingElse());
}
// Or:
async Task<Foo> ISomething.DoSomethingAsync() {
return DoSomethingElse();
}
}
我尝试跟上 Stephen Cleary 的 blog,我知道这些都没有真正提供任何异步好处,我对此表示满意。第二个对我来说似乎更正确,因为它不会假装它不是,但它确实会发出编译器警告,并且这些加起来会让人分心。
这一切都在 ASP.NET 中(Web MVC 和 WebAPI),如果有区别的话。
【问题讨论】:
-
您的“正常异步实现”无效...您没有返回任何内容,但您的返回类型是
Task<Foo>。 -
@B.K.谢谢,我忘记了那里的
return。固定。 -
您也可以使用
Task.RunSynchronously代替Task.Run来获得async样式的异常传播行为,而无需冗余ThreadPool卸载,如here 所述。 -
@Noseratio 谢谢,很高兴知道。
标签: c# .net asynchronous task-parallel-library async-await