真的不知道如何提出这个问题。我认为这与多任务处理或类似情况有关。
在form1中有一个用于打开form2的菜单按钮。在form2加载事件中,我需要加载数据以填充datagrid。
我正在使用EntityFramework。
当我按下菜单按钮时,显示form2但没有控件直到加载数据,并且因为卡在打开form2的按钮中而无法使用form1上的菜单。
在加载数据时是否可以使用程序的其他部分,例如在.net 4.5中单击另一个按钮以打开计算器(或与数据无关的任何部分)。
答案 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