我有一个简单的 Winforms 应用程序,上面有一个按钮。首先使用 EF 6.1.1 代码,如果我在查询中使用 .ToListAsync,它将卡住表单,直到结果从 SQL Server 返回。
private async void button1_Click(object sender, EventArgs e)
{
using( var context = new MyEFContext() )
{
var result = await context.MyTable.ToListAsync();
MessageBox.Show(result.Count);
}
}
如果我将 .ToListAsync() 调用放在不同的同步上下文中,比如在它之前添加 await Task.Delay(1).ConfigureAwaiter(false)
,它会正常工作。
有人知道我在这里缺少什么吗?为什么会这样?
最佳答案
基本上,所有 async
代码都是同步的,直到第一个 await
。
可能发生的情况是设置(打开连接等)花费了太多时间。
您应该始终将尽可能多的内容推送到 UI 线程之外。像这样:
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
private async void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;
var result = await GetMyTableAsync();
MessageBox.Show(result.Count);
this.button1.Enabled = true;
}
private async Task<IList<MyTableEntity>> GetMyTableAsync()
{
using( var context = new MyEFContext() )
{
return await context.MyTable.ToListAsync()
.ConfigureAwait(false);
}
}
关于c# - EF6 ToListAsync 卡住 Winforms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578759/