存储库是否应该返回Task <someentity>?

时间:2015-12-03 10:18:32

标签: c# .net asynchronous repository async-await

我正在设计一个存储库,但我有这个疑问。

我应该将其设计为阻止操作还是异步?

我倾向于认为阻塞更优雅,因为用户可以在需要时将调用包装为异步

Task.Run( () => repository.Get(...));

您怎么看?

1 个答案:

答案 0 :(得分:2)

由于基础数据源在大多数情况下是自然异步的(Web服务,数据库,文件),因此async API是首选方式。

  

阻塞更优雅,因为用户可以在需要时将调用包装为异步

实际上,反之亦然 如果需要,用户(not you!)可以将异步调用包装到同步调用中:

Task<MyObj> DoSomethingAsync() { ... }
MyObj DoSomething()
{
     return DoSomethingAsync().Result;
}

虽然:

Task.Run( () => repository.Get(...));

被称为"async over sync",必须避免:

  

我们应该为一个方法公开一个异步入口点   实际上同步?我们在.NET 4.5中采取的立场   基于任务的异步模式是一个坚定的“不”。