我正在使用线程处理网络应用程序。我有一个事件处理程序,导致在屏幕上显示一个表单。问题是使得此调用的线程在之后阻塞,因此表单也显示块。
我已经通过使该函数以其当前形式更改某些内容来破解此问题,然后使用所需的调用来强制将新表单强加到该线程上。这是一个可怕的黑客,什么是使新的form.Show()方法通过自己的线程的正确方法。
请注意,我尝试只创建一个只运行form.show()的工作线程,但表单在调用后立即消失。
谢谢,
PM
答案 0 :(得分:1)
您不希望在自己的线程中创建UI元素。启动应用程序的主要线程应该是UI线程。创建并显示此线程上的所有元素。所有沉重,长时间或阻塞的工作都应该在他们自己的线程上完成。
您可以使用BackgroundWorker执行单个附加任务,而不会阻止UI,并在需要更新主(UI)线程时获得自动同步,例如更新进度条或显示最终结果。
如果需要多个线程进行长时间运行,请使用ThreadPool。如果需要更新UI元素,则必须执行自己的跨线程同步。如果这就是您前往的路线,那么如何做到这一点有很多答案。
如果您有多个线程在等待某事发生时被阻止,您应该自己使用线程。这将使ThreadPool不受线程限制,因为它们都是阻塞的。 (我相信这在.NET 4中已经改变了,所以如果你的目标是那个版本,你可以在这种情况下轻松地继续使用ThreadPool。)
答案 1 :(得分:0)
您是否尝试将阻止调用放在BackgroundWorker(单独的线程)中?当阻塞调用完成后,后台工作线程完成(由主UI线程处理)。然后在完成的处理程序中,您可以显示您的表单/消息或其他......
如果您还没有尝试过那么请试一试。请注意,我没有测试过这个,因为我不确切知道你在做什么。
干杯。