【问题标题】:Multiple GUI one foreach thread in .net?.net中的多个GUI一个foreach线程?
【发布时间】:2012-07-27 15:38:43
【问题描述】:

我正在使用 C#/.net 开发一个多线程应用程序
我希望每个线程都创建自己的表单,以便它可以访问它并在其表单上显示其信息而不会出现任何问题
有什么办法吗?
我试过 Application.Run(new MyForm()) 但问题是这个函数阻塞了执行,我的线程无法完成它的工作。

【问题讨论】:

  • 改为使用 form.Show()。它们不在单独的线程中,但它们也不会阻塞。在不同线程中生成太多表单似乎不是一个好主意。
  • 为什么这不是一个好主意?我认为这比从所有线程更新一个 gui 更好

标签: c# .net winforms multithreading user-interface


【解决方案1】:

这是设计使然。线程一次只能做一件事,因此如果您的代码运行该线程上的 UI 将被阻塞,并且如果您想运行 UI,则必须使用一些消息传递构造(例如计时器)来获取你的工作完成了。

正确的方法确实是让一个 UI 线程和其他线程异步发布进度消息以显示在 UI 上(例如在表单上使用 BeginInvoke,从其他线程调用它是安全的)。

【讨论】:

  • 您也可以使用BackgroundWorker,它可以安全地将状态信息编组回表单。
  • 对。当还没有 BackgroundWorker 时,我在 .NET 1.1 中做过这种工作,但我总是忘记它。与此同时,我主要从事服务器开发,这使我免于处理线程绑定的窗口消息......
【解决方案2】:

你可以使用你的表单的Show方法来显示它,即使你想在Dialog表单中显示一个表单你也可以使用ShowDialog方法,Dialog会在其他表单之上。

【讨论】:

  • 大概,每个线程都会有某种信息,它将在自己的窗口中实时显示。所以模态形式是行不通的;他们会阻止。
  • @RobertHarvey - 你确定吗?带有发布到其他表单的数据的对象的消息会发生什么?好的,他们没有焦点,但他们应该仍然能够处理不需要焦点的发布消息?
【解决方案3】:

您需要使用 Show 方法从其线程中打开表单,并且您不能在来自不同线程的表单之间链接,例如来自不同线程的 MDI 父和子。 顺便说一句,您可以在主 GUI 线程中打开所有表单并使用调用来显示来自其他线程的数据而没有任何问题,我认为这种方法更好。看这里:http://msdn.microsoft.com/en-us/library/ms951089.aspx

【讨论】:

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