是否存在可能同时需要异步和非异步调用的数据访问层设计的最佳实践?
我看到其他一些帖子似乎在说在异步调用上使用Task.Run是同步调用异步方法的“变通方法”。
我拥有(服务层)可以同时使用的方法示例。
public override async Task<DataAccess.Fight> Insert(DataAccess.Fight item)
{
await UnitOfWork.Fight.Insert(item);
return item;
}
谢谢。 v。
答案 0 :(得分:4)
是否存在可能同时需要异步和非异步调用的数据访问层设计的最佳实践?
首先,我建议仅 公开异步方法。基于I / O的数据访问本质上是异步的,因此仅公开异步方法才是IMO可接受的解决方案。
如果确实需要异步和同步方法,建议您使用bool argument hack,它可以使您拥有同步和异步API,而无需重复任何逻辑。
我看到其他一些帖子似乎在说在异步调用上使用Task.Run是同步调用异步方法的“变通方法”。
我相信您指的是线程池黑客,我的文章也对此进行了介绍。如果您的代码依赖于任何上下文(例如HttpContext.Current
),则此方法将无效。它还可以将您代码的预期环境从单线程(隐式同步)执行转移到具有并行性的自由线程环境。 大多数代码可以解决这个问题,但这确实说明“并非只将其包装在Task.Run
中然后阻塞”并不是每种情况的解决方案。