在实体框架中,什么时候应该使用 FirstOrDefaultAsync 或 FirstOrDefault?

Tri*_*ner 3 c# entity-framework async-await

我在 ASP.NET Web API 中使用实体框架。在查询方法中,我可以选择使用标准 LINQ 方法FirstOrDefault()或 EF 方法FirstOrDefaultAsync()。什么时候使用其中一种或另一种是正确的?

据我所知使用:

var users = context.Users.FirstOrDefault(user => user.id == Id);
Run Code Online (Sandbox Code Playgroud)

var users = await context.Users.FirstOrDefaultAsync(user => user.id == Id);
Run Code Online (Sandbox Code Playgroud)

两者都会暂停正在运行的线程直到调用返回吗?该方法的唯一优点Async是它可以Awaited在一个Async方法中。但是,如果该方法也正在等待那么它就无关紧要了?除了你肯定会触发另一个线程被创建?

public async Task MethodOneAsync() {
  await MethodTwoAsync();
}

public async Task MethodTwoAsync() {
  await context.Users.FirstOrDefaultAsync(..);
  ...
}
Run Code Online (Sandbox Code Playgroud)

这与执行以下操作相同吗:

public async void MethodOneAsync() {
  MethodTwo();
  ... await something else to 'please' the async nature, or remove async all together ...
}

public void MethodTwo() {
  context.Users.FirstOrDefault(..);
  ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢,只是想澄清我自己的困惑。

注意:这是我的意思的例子

异步方法链

同步方法链

时间和订单

这些显示了我所说的链的含义,并且计时(9 和 0)以毫秒为单位。因此异步方法需要更长的时间来运行(相对)。

编辑:在评论中已经指出,这样做的原因是它释放了线程,但是如果被调用的方法是服务器内部的,那么它肯定会释放一个线程只是为了启动被调用的代码另一个线程?

Gab*_*uci 9

为别人想想吧!

我开玩笑,但这确实重点。同步方法将强制线程闲置,直到返回结果。

异步方法会在等待期间释放线程去做其他事情。例如,对于 ASP.NET,线程可以开始处理刚刚进来的其他人的另一个请求。这一点尤其重要,因为 ASP.NET 的线程数量有限。

在桌面应用程序中,如果您位于 UI 线程上,它将释放线程来响应用户输入。(我确信您经历过应用程序在关闭并执行某些操作时冻结的情况 - 这很烦人)

有一篇关于此的非常好的 Microsoft 文章应该有助于澄清问题:使用 async 和 wait 进行异步编程

  • 干杯,这真的很有帮助,谢谢!我没有意识到 Await 释放线程以供其他使用,然后在任务返回时继续!我认为由于等待,它使调用线程保持静止!:) (2认同)
  • 这是一本有用的读物​​:[没有线程](https://blog.stephencleary.com/2013/11/there-is-no-thread.html) (2认同)