【发布时间】:2015-09-29 03:50:53
【问题描述】:
我正在尝试异步等待,但遇到了不应该发生的 UI 阻塞。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadButton.Click += LoadButton_OnClick;
}
private async void LoadButton_OnClick(object sender, RoutedEventArgs e)
{
LoadButton.IsEnabled = false;
// await Task.Delay(2000);
using(TestContext ctx = new TestContext())
{
IList<User> users = await ctx.Users.ToListAsync();
}
LoadButton.IsEnabled = true;
}
}
如果我注释 DbContext 位并取消注释 Task.Delay,它的行为与预期一样 - 不会阻塞 UI。
根据我的理解,ToListAsync() 方法仍然从 UI 线程调用,但不应阻止它。即使该方法受 CPU 限制(可能不是),它也会导致延迟,而不是完整的块。
我的问题:
我理解正确吗?
为什么我的 UI 在等待 ToListAsync() 时会阻塞?
编辑
我尝试在调用此方法之前进行数据库调用以加热所有内容并确保它不会在建立第一个连接时阻塞。此外,我尝试向 DbSet 添加数千个条目并等待 SaveChangesAsync 并且发生了同样的事情 - UI 完全冻结了几秒钟。
编辑 2
我尝试了另一个具有相同代码的示例,它似乎可以正常工作。不同之处在于,在第一个示例中,我使用的是 Code First 和 SQL CE,而在工作示例中,我使用的是 Database First 和 SQL Server。
【问题讨论】:
-
Task.Delay(2000)当然会阻塞代码2秒。您应该解释为什么要延迟 2 秒。 -
@Hopeless 他正在测试 UI 在等待时不会阻塞。模拟 CPU 密集型任务
-
@alexw 你的意思是他包括那行来测试它吗?
-
@Hopeless 是的,只是为了测试。在 2 秒内,UI 仍然响应。当它访问数据库时,它没有响应
-
也许是建立与数据库的连接是导致冻结的原因?删除
ToListAsync,只剩下一个空的using,看看它是否仍然存在。
标签: c# wpf entity-framework async-await