gpt4 book ai didi

c# - ASPNet Entity Framework 6 - EF6,在同一工作单元中混合异步和同步

转载 作者:行者123 更新时间:2023-12-02 12:37:06 29 4
gpt4 key购买 nike

我今天遇到了一些代码行,归结起来,相当于这样:

using (var db = new AppDbContext())
{
var foo = await db.Foos
.Where(m => m.Name == "BuzzBaz" )
.FirstAsync();

foo.Name = "Quxx";
db.SaveChanges();
}

请注意,选择查询是异步,但对 SaveChanges() 的调用不是。它是同步的!

这可能会产生任何问题吗?我是否应该重构它以使用 db.SaveChangesAsync(); 一切都很好?或者也许只是调用 First() 而不是 FirstAsync()?或者也许它是无害的并且可能对整体系统性能有一些好处?

我发现一些文档让我认为完全删除 async 可能是一个不错的选择。 https://learn.microsoft.com/en-us/ef/ef6/fundamentals/async

In most applications using async will have no noticeable benefits and even could be detrimental. Use tests, profiling and common sense to measure the impact of async in your particular scenario before committing to it.

最佳答案

您的代码实际上是“正确的”,这意味着它没有根本性缺陷。

让我们分析一下发生了什么,以及我的 2 美分:

  • 对数据库进行查询时(FirstAsync),使用 await 意味着指令将按顺序执行,但线程不会被阻塞(异步调用)并且可以用于其他事情。这可能是一件好事,如果这是一个服务器应用程序,您可能希望您的线程能够在等待数据库响应时处理其他请求。

  • 但是,使用非异步 SaveChanges 会阻塞线程。这本身并不是一个错误,但由于它也是数据库上的 I/O 操作,因此可能会阻塞线程一段很长的时间。如果您也在这里使用异步版本 await ,它确实看起来会更加“一致”。

这是一个问题吗?这取决于。您的应用程序使用频繁吗?您的用户在重负载时是否遇到 react 性低的情况?那么在这种情况下,使用保存时异步可能是一个潜在的改进。

否则,正如链接的 MSDN 文章中所建议的那样,在您知道它会产生影响之前,我的建议是不要太担心。

混合使用本身并不是问题。

就个人而言,为了一致性,我也会选择异步 SaveChanges,并想象数据库写入是一些可能会很慢的 I/O 操作。

如果它是桌面应用程序,只需确保您没有阻塞 UI 线程即可。

关于c# - ASPNet Entity Framework 6 - EF6,在同一工作单元中混合异步和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59934983/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com