【问题标题】:Winforms application with forms in different threadsWinforms 应用程序与不同线程中的表单
【发布时间】:2012-12-07 12:11:25
【问题描述】:

在我正在处理的应用程序中,有几种形式;一个用于显示 3d 图像,另一个用于管理它。图像中的某些更改非常耗时,并且在进行更改时,两种形式都不会被重绘。

我想要实现的是至少控制表单(仅由相当标准的组件组成)以继续与用户交互并继续重绘。在我看来,它应该被移到不同的线程中,因为它现在使用的线程太忙了。

我该怎么做? Application.Run(secondForm) 就足够了吗?

【问题讨论】:

  • Application.Run 阻止?
  • 在检查 msdn 之后,似乎是的,确实如此。可能从另一个线程内部调用它就可以了。
  • 这不是重复的,但我认为你可以从这个question得到一个好的开始

标签: c# winforms


【解决方案1】:

您应该在另一个线程中完成繁重的工作。您可以使用后台工作程序来简化操作或管理自己的线程。

类似这样的:

  • 控制器表单按下开始 => 启动线程/后台工作程序并在其中进行计算
  • 计算完成后,更新您的图像表单。您可以在完成后调用一个事件并让您的图像/控制器表单订阅它。
  • 或者当控制器表单在计算完成之前发生更改时,您可以取消后台工作程序并重新开始。

【讨论】:

    【解决方案2】:

    通常最好将繁重的工作交给 BackgroundWorker,例如Carra suggested

    但是要直接回答您的问题,是的,您可以将表单放入单独的线程中。在这种情况下它可能并不理想,因为您的背景窗口在很多时候仍然没有响应;但这是可能的。

    您希望使用手动创建的Thread(而不是例如TaskThreadPool 线程),并确保在启动线程之前调用Thread.SetApartmentState(ApartmentState.STA) ,因为大多数 UI 需要单线程单元。然后您可以在该线程中创建一个表单,然后调用 Application.Run 或 Form.ShowDialog。

    当然,所有常见的线程限制都适用(只能从创建它们的线程访问表单及其控件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多