为什么后台线程会阻止GUI

时间:2014-12-11 13:06:36

标签: c# .net winforms

我有一个C#Winforms应用程序,通过供应商库与USB设备通信。我用后台线程运行这个接口。在供应商构造函数期间,整个Winforms应用程序GUI被冻结。 CPU的一个核心是100%,但其他核心是空闲的。如何确定供应商阻止GUI的调用?

我像这样运行后台线程 -

public HardwareInterfaceClass() {
    var hardwareThread = new Thread(HardwareInterfaceThread);
    hardwareThread.IsBackground = true;
    hardwareThread.Name = "USB Interface Communication";
    hardwareThread.Start();
    return
}


private void HardwareInterfaceThread() {

  var usbInterface = new USBInterfaceHardware(0);  // Takes 5 seconds and blocks GUI
  ...

}

1 个答案:

答案 0 :(得分:2)

您发布的代码中没有任何内容可以阻止UI线程。所以有两种可能性:

  1. 您正在调用的库代码中存在阻止UI线程的内容。
  2. UI线程并未真正被阻止。
  3. 不可能确定哪个是正确的,虽然第一个选项会非常不寻常,特别是如果你没有实际传递任何东西到库代码甚至可以告诉它你的UI线程在哪里是(但并非不可能......它可以在内部找到你的UI线程,并以某种方式混淆它)。

    如果第二个选项是正确的,那么UI可能似乎被阻止,但根本没有获得足够的CPU。你的其他CPU内核空闲的事实表明这不是问题所在,但鉴于第一种可能性有多么遥远,至少值得考虑。

    如果您的后台线程占用了UI时间的CPU时间,那么您可以通过设置hardwareThread.Priority = ThreadPriority.BelowNormal;来解决这个问题。实际上,对于任何旋转消耗100%核心CPU时间的线程来说,这是一个好主意。

    当然,还有第三种可能性:在您自己的代码中,您在某个后台线程工作时以某种方式导致UI线程被阻止。但是如果没有简洁,完整的代码示例,就无法解释它的位置。我们只能查看您发布的代码,并且该代码不会在任何地方阻止UI。