使用不同线程中的表单Winforms应用程序

时间:2012-12-07 12:11:25

标签: c# winforms

在我正在处理的应用程序中,有几种形式;一个用于显示三维图像,另一个用于管理。图像中的一些变化是耗时的,并且在它们经历时,两种形式都没有重新绘制。

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

我该怎么做? Wil Application.Run(secondForm)是否足够?

2 个答案:

答案 0 :(得分:2)

你应该在另一个线程中进行繁重的工作。您可以使用后台工作程序来保持简单或管理自己的线程。

这样的事情:

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

答案 1 :(得分:0)

通常最好将重物卸载到BackgroundWorker上,如Carra suggested

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

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

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