Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有异步和同步需求的数据访问_C#_Async Await - Fatal编程技术网

C# 具有异步和同步需求的数据访问

C# 具有异步和同步需求的数据访问,c#,async-await,C#,Async Await,对于同时需要异步和非异步调用的数据访问层的设计,是否有最佳实践 我看到其他一些帖子似乎在说,使用Task.runonasync调用是同步调用异步方法的一种变通方法 我有一个服务层的方法示例,它可以双向利用 public override async Task<DataAccess.Fight> Insert(DataAccess.Fight item) { await UnitOfWork.Fight.Insert(item); return item; }

对于同时需要异步和非异步调用的数据访问层的设计,是否有最佳实践

我看到其他一些帖子似乎在说,使用Task.runonasync调用是同步调用异步方法的一种变通方法

我有一个服务层的方法示例,它可以双向利用

public override async Task<DataAccess.Fight> Insert(DataAccess.Fight item)
{
      await UnitOfWork.Fight.Insert(item);
      return item;
}
谢谢。 五,

对于同时需要异步和非异步调用的数据访问层的设计,是否有最佳实践

首先,我建议只公开异步方法。基于I/O的数据访问本质上是异步的,因此只有公开异步方法是IMO可以接受的解决方案

如果您确实需要异步和同步方法,我建议使用,它允许您在不复制任何逻辑的情况下同时拥有同步和异步API

我看到其他一些帖子似乎在说,使用Task.runonasync调用是同步调用异步方法的一种变通方法

我相信您指的是线程池黑客,我的文章中也有介绍。如果您的代码依赖于任何上下文(例如HttpContext.Current),那么这将不起作用。它还可以将代码的预期环境从单线程隐式同步执行转移到具有并行性可能性的自由线程环境。大多数代码对此没有问题,但这确实说明了将其包装在Task.Run-then-block中并不是每个场景的解决方案

对于同时需要异步和非异步调用的数据访问层的设计,是否有最佳实践

首先,我建议只公开异步方法。基于I/O的数据访问本质上是异步的,因此只有公开异步方法是IMO可以接受的解决方案

如果您确实需要异步和同步方法,我建议使用,它允许您在不复制任何逻辑的情况下同时拥有同步和异步API

我看到其他一些帖子似乎在说,使用Task.runonasync调用是同步调用异步方法的一种变通方法


我相信您指的是线程池黑客,我的文章中也有介绍。如果您的代码依赖于任何上下文(例如HttpContext.Current),那么这将不起作用。它还可以将代码的预期环境从单线程隐式同步执行转移到具有并行性可能性的自由线程环境。大多数代码对此没有问题,但这确实说明了将其包装在Task.Run and then block中并不是每个场景的解决方案。

实现异步和非异步方法,并使用通用命名约定,将所有异步方法命名为SomethingSomethingAsync。不要简单地将同步方法包装到任务中。在处理I/O时运行。这是对计算线程的浪费。实现异步和非异步方法,并使用通用命名约定,将所有异步方法命名为SomethingSomethingAsync。不要简单地将同步方法包装到任务中。在处理I/O时运行。这是对计算线程的浪费。