2010-11-12 134 views
0

我正在使用线程处理网络应用程序。我有一个事件处理程序,它会在屏幕上显示一个表单。问题在于使得这个调用的线程在之后立即阻塞,所以表单也显示了块。C#网络应用程序线程导致程序阻止

我已经做的形式功能改变的东西它目前在砍死这个问题,然后要求用于调用迫使新的形式在该线程。这是一个可怕的黑客,什么是正确的方式来使新的form.Show()方法通过自己的线程。

请注意,我已经试过就是这个只运行form.show工作者线程(),但形式的呼叫后立即消失。

谢谢

PM

+0

分享一些代码,这将帮助我们了解什么您可能会丢失你的函数调用。 – BeemerGuy 2010-11-12 01:51:04

+0

看看这个线程:http://stackoverflow.com/questions/2954139/reason-for-net-ui-element-thread-restriction- UI变化必须始终在一个线程中执行 - 所以它不是可怕的黑客,但Windows的限制。 – weismat 2010-11-12 05:33:21

回答

1

您不希望在自己的线程中创建UI元素。启动应用程序的主线程应该是UI线程。创建并显示此线程上的所有元素。所有你沉重的,长时间或阻塞的工作应该在他们自己的线程上完成。

可以使用的BackgroundWorker不会阻塞你的UI来执行一个额外任务,并得到自动同步,当你需要进行更新,主(UI)线程,例如更新进度条或显示最终结果。

如果您需要多个线程执行长时间运行的工作,请使用ThreadPool。如果您需要更新UI元素,您将必须执行自己的跨线程同步。如果这是你走的路线,那么如何做到这一点已经有很多答案。

如果你在等待事情发生,你应该自己线程使用被阻塞多个线程。这将保持ThreadPool不被线程阻塞,因为它们都被阻塞。 (我相信,如果您定位的版本,你可以很容易很可能继续使用线程池在这种情况下,这已经是.NET 4这样改变。)

0

您是否尝试过放置阻塞调用在一个BackgroundWorker(单独的线程)?当这个阻塞调用完成后,你的后台工作线程完成了(由主UI线程处理)。然后在完成处理程序可以显示你的表格/消息或任何...

如果你还没有试过,然后给它一个镜头。请注意,我没有测试过,因为我不知道你在做什么。

干杯。