我有一个带有按钮的简单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线程之外尽可能多地进行推送。像这样:

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()
             .ConfigureAwaiter(false);
    }
}

关于c# - EF6 ToListAsync卡住Winforms,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27578759/

10-11 03:39