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)以毫秒为单位。因此异步方法需要更长的时间来运行(相对)。
编辑:在评论中已经指出,这样做的原因是它释放了线程,但是如果被调用的方法是服务器内部的,那么它肯定会释放一个线程只是为了启动被调用的代码另一个线程?
为别人想想吧!
我开玩笑,但这确实是重点。同步方法将强制线程闲置,直到返回结果。
异步方法会在等待期间释放线程去做其他事情。例如,对于 ASP.NET,线程可以开始处理刚刚进来的其他人的另一个请求。这一点尤其重要,因为 ASP.NET 的线程数量有限。
在桌面应用程序中,如果您位于 UI 线程上,它将释放线程来响应用户输入。(我确信您经历过应用程序在关闭并执行某些操作时冻结的情况 - 这很烦人)
有一篇关于此的非常好的 Microsoft 文章应该有助于澄清问题:使用 async 和 wait 进行异步编程