Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# EF选择性能-Task.FromResult vs ToListSync_C#_.net_Performance_Entity Framework_Async Await - Fatal编程技术网

C# EF选择性能-Task.FromResult vs ToListSync

C# EF选择性能-Task.FromResult vs ToListSync,c#,.net,performance,entity-framework,async-await,C#,.net,Performance,Entity Framework,Async Await,我试图找出通过实体框架和async await选择数据的最佳方法。在下面的代码中,我有两个选项 第一个使用Task.FromResult。 第二个选项尝试使用async await关键字来优化代码 一, public Task ExecuteAsync(GetAllExamplesQuery) { var designExamples=\u copyDataDb.designExamples.OrderBy(dE=>dE.Order)。选择(DesignExample.MapFromEntity

我试图找出通过实体框架和async await选择数据的最佳方法。在下面的代码中,我有两个选项

第一个使用Task.FromResult。
第二个选项尝试使用async await关键字来优化代码

一,

public Task ExecuteAsync(GetAllExamplesQuery)
{
var designExamples=\u copyDataDb.designExamples.OrderBy(dE=>dE.Order)。选择(DesignExample.MapFromEntity);
返回Task.FromResult(设计示例);
}
二,

public异步任务ExecuteAsync(GetAllExamplesQuery)
{
var designExamples=await_copyDataDb.designExamples.OrderBy(dE=>dE.Order.ToListAsync();
返回designExamples.Select(DesignExample.MapFromEntity);
}
  • 与第一个选项相比,第二个选项是否提高了总体性能
  • 第二个选项将等待对数据库的调用,但在这种情况下,这真的会给我带来好处吗

    • 这些方法做两件不同的事情

      前者同步地执行对
      DbContext
      的调用,并将结果包装到
      任务中。这意味着调用线程在调用数据库时不会将控制权交还给调用方。此方法的使用者可能不理解此
      ExecuteAsync
      为何会阻塞其线程

      后者使用
      ToListAsync
      进行异步调用,从而释放调用线程。这意味着调用者可以同时对线程做更多的工作,当查询完成执行时,执行将恢复

      第二个选项是否提高了与项目相关的整体绩效 首先

      为了知道必须度量代码,这主要取决于执行查询所需的时间。请注意,使用
      async await
      确实会在后台生成状态机,这会带来开销(尽管对于代码可读性的提高来说,这是最小的)。注意:不能对同一DbContext执行多个查询

      第二个选项将等待对数据库的调用,但是 在这种情况下真的能给我带来好处吗

      这样做的主要好处是,当查询运行时,线程可以自由地做更多的工作。在像ASP.NET这样的环境中,这意味着ASP.NET线程池可以同时自由处理更多的传入请求,这实际上取决于您试图实现的目标


      关于异步DB调用的使用有一个有趣的讨论,我认为您会发现其中很有趣

      “不支持在同一上下文实例上执行多个活动操作。在调用此上下文上的其他方法之前,请使用“等待”确保所有异步操作都已完成。”@PaulZahra我不确定这句话如何适用于我的案例?关键是异步执行数据库操作是非常危险的。@PaulZahra我真的不明白为什么和什么时候会有危险。你能详细说明一下吗?@PaulZahra我现在明白了。例如,如果我在不等待第一次调用的情况下对上下文进行另一次异步调用,我可能会遇到麻烦。
      public Task<IEnumerable<DesignExample>> ExecuteAsync(GetAllExamplesQuery query)
      {
          var designExamples = _copyDataDb.DesignExamples.OrderBy(dE => dE.Order).Select(DesignExample.MapFromEntity);
      
          return Task.FromResult(designExamples);
      }
      
      public async Task<IEnumerable<DesignExample>> ExecuteAsync(GetAllExamplesQuery query)
      {
          var designExamples = await _copyDataDb.DesignExamples.OrderBy(dE => dE.Order).ToListAsync();
      
          return designExamples.Select(DesignExample.MapFromEntity);
      }