c# - EF6 ToListAsync 卡住 Winforms

标签 c# winforms entity-framework async-await

我有一个简单的 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/

相关文章:

c# - 在 Windows 7 中使用备用数据流(分支)?

c# - 从面板中删除动态控件

c# - 重定向到 Jquery 中的 Action-Controller MVC 4

c# - 后台工作人员的 UI 访问问题

c# - 如何创建人物编辑器?

c# - Entity Framework (edmx)中列出的表的映射应该是什么

c# - 使用 PropertyInfo 忽略属性

sql - 可以使用外键在同一张表中对父子关系建模吗?

c# - 如何将项目列表绑定(bind)到堆栈面板内的文本框

c# - Winforms .net Datepicker 不遵守 24 小时格式?