代码之家  ›  专栏  ›  技术社区  ›  user472875

网络应用程序线程导致程序阻塞

  •  0
  • user472875  · 技术社区  · 15 年前

    我正在开发一个带有线程的网络应用程序。我有一个事件处理程序,它会在屏幕上显示一个表单。问题是,使这个调用的线程会在后面阻塞,所以显示块的窗体也会阻塞。

    我已经通过使该函数改变它当前所处的形式来解决这个问题,然后使用所需的invoke将新形式强制到该线程上。这是一个可怕的黑客行为,正确的方法是什么使新的form.show()方法通过它自己的线程。

    请注意,我只是尝试创建一个只运行form.show()的工作线程,但该窗体在调用后立即消失。

    谢谢您,

    颗粒物

    2 回复  |  直到 15 年前
        1
  •  1
  •   Erik Noren    15 年前

    您不希望在自己的线程中创建UI元素。启动应用程序的主线程应该是UI线程。创建并显示此线程上的所有元素。所有繁重的、长期的或阻塞的工作都应该在它们自己的线程上完成。

    当需要更新主(UI)线程(如更新进度条或显示最终结果)时,可以使用BackgroundWorker执行单个附加任务,而不阻塞UI,并获得自动同步。

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

    如果有多个线程在等待发生什么事情时被阻塞,那么您应该自己使用线程。这将防止线程池缺少线程,因为它们都是阻塞的。(我相信这在.NET 4中已经改变了,所以如果您要确定该版本的目标,那么在这种情况下您可能很容易继续使用threadpool。)

        2
  •  0
  •   AlvinfromDiaspar    15 年前

    您是否尝试将阻塞调用放入BackgroundWorker(独立线程)?当阻塞调用完成时,后台工作线程就完成了(由主UI线程处理)。然后在完成的处理程序中,您可以显示您的表单/消息或其他内容…

    如果你没试过,那就试试看。注意,我没有测试过这个,因为我不知道你在做什么。

    干杯。