我有一个接口
interface IFoo
{
Task<Bar> CreateBarAsync();
}
有两种方法可以创建Bar
,一种是异步的,一种是同步的。我想为这两种方法分别提供一个接口实现。
对于异步方法,实现可能如下所示:
class Foo1 : IFoo
{
async Task<Bar> CreateBarAsync()
{
return await AsynchronousBarCreatorAsync();
}
}
我应该如何实现使用同步方法创建Bar
的Foo2
类?
我可以实现同步运行的方法:
async Task<Bar> CreateBarAsync()
{
return SynchronousBarCreator();
}
编译器会警告在方法签名中使用 async
:
这个异步方法缺少 'await' 操作符,将以同步方式运行。考虑使用 'await' 运算符等待非阻塞的 API 调用,或者使用 'await Task.Run(...)' 在后台线程上处理 CPU 绑定型工作。
或者,我可以显式地实现该方法返回 Task<Bar>
。但在我看来,代码看起来就不太易读:
Task<Bar> CreateBarAsync()
{
return Task.Run(() => SynchronousBarCreator());
}
从性能角度来看,我认为这两种方法的开销大致相同,对吗?
我应该选择哪种方法; 同步实现async
方法还是显式地将同步方法调用包装在Task
中?
编辑
我正在使用来自Microsoft Async NuGet包的async / await扩展的.NET 4项目。在.NET 4上,Task.Run
可以替换为TaskEx.Run
。我故意在上面的示例中使用了.NET 4.5方法,希望更清楚地表达主要问题。
Task.FromResult(SynchronousBarCreator())
比Task.Run(...)
更好,因为它不会实际安排和运行任务来获取结果。 - Steve GuidiSynchronousBarCreator
是一个长时间运行的程序吗?它是 CPU 密集型的,还是大部分时间都在等待其他操作完成? - CodesInChaos