【发布时间】:2021-05-26 05:50:56
【问题描述】:
也许我错了,这实际上是好的行为,但是我不明白,为什么他们甚至会将异步后缀放在方法名称中并使其可等待。
只是为了轻松重现,这就足够了:
private async void Button_Click(object sender, RoutedEventArgs e)
{
using var ctx = new eWMSContext();
var a = await ctx.TJobLines.ToListAsync();
}
这个调用会阻止 UI,尽管它看起来不应该,并且将其包装到 Task.Run 似乎不合逻辑。
我找不到任何资源为什么会发生这种情况。
此资源解释说,它不应该阻止 UI,但它会: https://docs.microsoft.com/lt-lt/ef/core/miscellaneous/async
我正在使用(所有都是 .NET Core 3.1 的最新版本):
EF Core 3.1.12
Oracle.EntityFrameworkCore 3.19.80
Oracle.ManagedDataAccess.Core 2.19.101
【问题讨论】:
-
ToListAsync()是其中唯一的async部分,并且大部分时间(和阻塞)发生在同步构造函数和属性获取器上。 -
有些相关:Why File.ReadAllLinesAsync() blocks the UI thread?。不幸的是,现实并不总是符合我们的期望。幸运的是,我们有
Task.Run在需要时为我们提供帮助。 -
@PoulBak 你好,它真的没有。我做了测试,阻塞部分是 ToListAsync 本身。 FindAsync、FirstOrDefaultAsync 等的相同帐户...所有 EF Core 异步方法都阻塞了 UI。
-
@TheodorZoulias 嘿,谢谢你的链接,大概就是这样......说实话有点难过。无论如何感谢这篇文章
标签: c# wpf entity-framework async-await entity-framework-core