1

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

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

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

4

2 回答 2

2

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

像这样的东西:

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

正如Carra 建议的那样,通常最好将繁重的工作转移到 BackgroundWorker 上。

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

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

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

于 2012-12-07T12:49:23.167 回答