【问题标题】:How to use other parts of program when loading data加载数据时如何使用程序的其他部分
【发布时间】:2014-10-21 18:47:01
【问题描述】:

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

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

我正在使用 EntityFramework。

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

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

【问题讨论】:

  • 你应该看看异步编程。 this 应该会帮助你。
  • 谢谢。有人可以发布简单的代码以异步打开form2或与我的问题相关的东西。

标签: c# .net entity-framework


【解决方案1】:

您的方法的问题在于您没有考虑到 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 方法,你可以看看像 BackgroundWorker 这样的旧 API 来在后台加载数据:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多