在我正在处理的应用程序中,有几种形式;一个用于显示 3d 图像,另一个用于管理它。图像中的某些更改非常耗时,并且在进行更改时,两种形式都没有被重绘。
我想要实现的是至少控制表单(仅由相当标准的组件组成)以继续与用户交互并继续重绘。在我看来,它应该被移到不同的线程中,因为它现在使用的线程太忙了。
我该怎么做?Application.Run(secondForm) 就足够了吗?
您应该在另一个线程中完成繁重的工作。您可以使用后台工作人员来简化工作或管理自己的线程。
像这样的东西:
正如Carra 建议的那样,通常最好将繁重的工作转移到 BackgroundWorker 上。
但是要直接回答您的问题,是的,您可以将表单放入单独的线程中。在这种情况下它可能并不理想,因为您的背景窗口在很多时候仍然没有响应;但这是可能的。
您希望使用手动创建的线程(而不是任务或ThreadPool线程),并确保在启动线程之前调用Thread.SetApartmentState (ApartmentState.STA),因为大多数 UI 需要单线程公寓。然后,您可以在该线程内创建一个 Form,并调用 Application.Run 或 Form.ShowDialog。
当然,所有常见的线程限制都适用(只能从创建它们的线程访问表单及其控件)。