加载数据时如何使用程序的其他部分

时间:2014-10-21 08:25:06

标签: c# .net entity-framework

真的不知道如何提出这个问题。我认为这与多任务处理或类似情况有关。

在form1中有一个用于打开form2的菜单按钮。在form2加载事件中,我需要加载数据以填充datagrid。

我正在使用EntityFramework。

当我按下菜单按钮时,显示form2但没有控件直到加载数据,并且因为卡在打开form2的按钮中而无法使用form1上的菜单。

在加载数据时是否可以使用程序的其他部分,例如在.net 4.5中单击另一个按钮以打开计算器(或与数据无关的任何部分)。

1 个答案:

答案 0 :(得分:0)

您的方法存在的问题是您没有考虑Winforms使用单个UI线程,因此当您尝试使用EF在第二个表单中加载同步数据时,实际上是阻止 UI线程,这就是第二种形式不会立即出现的原因。

一个显而易见的解决方案是取消阻止UI线程,因此它可以在数据加载到后台线程时绘制第二个表单,并在准备好时显示数据。

一种可能的方法是覆盖Form2类中的OnLoad方法。然后,您可以使用TPL任务以异步方式在后台加载EF数据,然后将数据同步到UI线程。

我能想到的最简单的代码是使用Async / Await和TPL任务:

protected override async void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    var result = await Task.Run(() => _ctx.MyEntities.Where(a => a.Name.Contains("mx")).ToListAsync());

    // Do stuff with your data
    txtInfo.Text = "Loaded Data";
}

_ctx变量是应用程序的EF DbContext。

如果您不喜欢上面的TPL方法,可以查看较早的API,如BackgroundWorker,以便在后台加载数据:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx