异步方法块UI线程实体Framewok

时间:2016-12-27 13:49:11

标签: c# entity-framework async-await

我请等待表单,以便每次拨打数据库时向用户显示。我不知道为什么但实体框架阻止异步方法上的UI线程。这是我的代码:

private async void button_click(object sender, EventArgs e)
{
    var formLoading = new FormLoading("Loading data, please wait"));
    formLoading.Show(this);
    var list =  await context.Set<Foo>().ToListAsync().ConfigureAwait(false);
    formLoading.Close();
    //....
}

当实体框架正在进行数据库调用时,ui不会刷新并且我的加载表单被冻结。不过,如果我在DB调用之前创建一个Task.Delay,或者将代码放在Task.Run中,那就完美了。

private async void button_click(object sender, EventArgs e)
{
    var formLoading = new FormLoading("Loading data, please wait"));
    formLoading.Show(this);

    await Task.Delay(1).ConfigureAwait(false);

    var list =  await context.Set<Foo>().ToListAsync().ConfigureAwait(false);
    formLoading.Close();
    //....
}

这段代码也很完美

private async void button_click(object sender, EventArgs e)
{
    var formLoading = new FormLoading("Loading data, please wait"));
    formLoading.Show(this);
    IList<Foo> list;
    await Task.Run(() => 
    {
        list =  context.Set<Foo>().ToList(); 
    });

    formLoading.Close();
    //....
}

0 个答案:

没有答案