我有一个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
...
}
答案 0 :(得分:2)
您发布的代码中没有任何内容可以阻止UI线程。所以有两种可能性:
不可能确定哪个是正确的,虽然第一个选项会非常不寻常,特别是如果你没有实际传递任何东西到库代码甚至可以告诉它你的UI线程在哪里是(但并非不可能......它可以在内部找到你的UI线程,并以某种方式混淆它)。
如果第二个选项是正确的,那么UI可能似乎被阻止,但根本没有获得足够的CPU。你的其他CPU内核空闲的事实表明这不是问题所在,但鉴于第一种可能性有多么遥远,至少值得考虑。
如果您的后台线程占用了UI时间的CPU时间,那么您可以通过设置hardwareThread.Priority = ThreadPriority.BelowNormal;
来解决这个问题。实际上,对于任何旋转消耗100%核心CPU时间的线程来说,这是一个好主意。
当然,还有第三种可能性:在您自己的代码中,您在某个后台线程工作时以某种方式导致UI线程被阻止。但是如果没有简洁,完整的代码示例,就无法解释它的位置。我们只能查看您发布的代码,并且该代码不会在任何地方阻止UI。