Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/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#_Linq_Asynchronous_Async Await_Entity Framework Core - Fatal编程技术网

C# 对数据库进行异步调用的正确方法

C# 对数据库进行异步调用的正确方法,c#,linq,asynchronous,async-await,entity-framework-core,C#,Linq,Asynchronous,Async Await,Entity Framework Core,所以我问这个问题是因为我不确定这些选项中的哪一个是保持异步的正确解决方案。我想两者都能胜任,但我还是想确定哪一种是最好的方式: 调用方法(保持不变) 选项1:存储库 注意:此选项未使用异步修改器 公共任务GetByIdAsync(int-id) { return Query().SingleOrDefaultAsync(e=>e.Id==Id); } 公共IQueryable查询() { 返回_dbContext.Set().AsQueryable();; } 选项2:存储库(使用wait和异

所以我问这个问题是因为我不确定这些选项中的哪一个是保持异步的正确解决方案。我想两者都能胜任,但我还是想确定哪一种是最好的方式:

调用方法(保持不变)

选项1:存储库 注意:此选项未使用异步修改器

公共任务GetByIdAsync(int-id)
{
return Query().SingleOrDefaultAsync(e=>e.Id==Id);
}
公共IQueryable查询()
{
返回_dbContext.Set().AsQueryable();;
}
选项2:存储库(使用wait和异步修饰符)

公共异步任务GetByIdAsync(int-id)
{
return wait Query().SingleOrDefaultAsync(e=>e.Id==Id);
}
公共IQueryable查询()
{
返回_dbContext.Set().AsQueryable();;
}

我认为这将以基于意见的方式结束,因此我将首先给出我的意见:

2和3似乎非常规地使用EF(例如,不直接在上下文中使用DbSet,而是按类型使用)

1根本不使用EF,但对于单元测试非常有用,因为实际的数据库调用是隐藏的(尽管如果使用.net core,则可以使用内存中的数据库来测试EF,因此这可能是毫无意义的)

您可能会认为2中的第一个函数是好的,因为它只是返回一个任务而不等待(这节省了一个上下文切换)


另一件要考虑的事情是,即使EF支持异步/等待,每个DbValm也不能同时被多个任务使用。如果您尝试此操作,应该会出现异常。当然,如果每个工作单元都有一个单独的DbContext,那么这不是问题。

Stephen C说:在这种情况下,排除
async\awat
是安全的,因此可以稍微减少开销,但这样做并不总是安全的,例如,如果异步方法调用位于使用或try块的
内部。相关:您似乎误读了问题。只有两种选择。第一段代码是他们如何调用选项1和2中的方法,问题是在安全的情况下是否应该删除async Wait。您好,感谢您的快速回复:)我刚刚从@juharr看到了答案。这正是我要考虑的问题,如果它是一个有效的解决方案,在SingleOrDefaultAsync上省略async修饰符+Wait,只返回任务,以便在调用方法上等待它
  public async Task GetEntry(int id)
  {
     var entity = await _repository.GetByIdAsync(id)
  }
  public Task<MyEntity> GetByIdAsync(int id)
  {
       return Query().SingleOrDefaultAsync(e => e.Id == id);
  }

  public IQueryable<MyEntity> Query()
  {
      return _dbContext.Set<MyEntity>().AsQueryable();;
  }
  public async Task<MyEntity> GetByIdAsync(int id)
  {
       return await Query().SingleOrDefaultAsync(e => e.Id == id);
  }

  public IQueryable<MyEntity> Query()
  {
      return _dbContext.Set<MyEntity>().AsQueryable();;
  }