【问题标题】:C# network application threading causes program to blockC#网络应用程序线程导致程序阻塞
【发布时间】:2010-11-12 01:40:12
【问题描述】:

我正在开发一个带有线程的网络应用程序。我有一个事件处理程序,它会导致屏幕上显示一个表单。问题是进行此调用的线程紧随其后,因此显示块的表单也是如此。

我已经解决了这个问题,方法是使该函数更改其当前形式的某些内容,然后使用所需的调用将新形式强制到该线程上。这是一个可怕的黑客,让新的 form.Show() 方法通过自己的线程的正确方法是什么。

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

谢谢,

下午

【问题讨论】:

  • 分享一些代码,它将帮助我们了解您在函数调用中可能缺少的内容。
  • 看看这个线程:stackoverflow.com/questions/2954139/… - UI 更改必须始终在一个线程中执行 - 所以这不是可怕的 hack,而是 Windows 的限制。

标签: c# multithreading


【解决方案1】:

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

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

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

如果您有多个线程在等待某事发生时被阻塞,您应该自己使用线程。这将使 ThreadPool 不会因为线程都处于阻塞状态而被饿死。 (我相信这在 .NET 4 中已经改变了,所以如果你的目标是那个版本,你可以在这种情况下轻松地继续使用 ThreadPool。)

【讨论】:

    【解决方案2】:

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

    如果你还没有尝试过,那就试一试。请注意,我没有对此进行测试,因为我不知道你在做什么。

    干杯。

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多