P a*_*u l 5 c# multithreading winforms
我正在使用后台线程来通过USB初始化仪器.当我尝试打开设备时,UI挂起.我希望后台线程在设备上调用Open时暂停,但不是UI线程.我正在测试这个没有来自后台线程的UI交互.我不知道如何调试这个问题,这个问题太广泛了,但也许有人之前见过这样的事情.据我所知,ActiveX互操作没有任何问题,设备正常工作.这是一般方法:
using System;
using FancyVoltmeterLibrary;
namespace SOQuestion
{
public class MeterClass
{
private FancyVoltmeter meter;
private Thread meterThread;
public MeterClass()
{
// Create instance of ActiveX/COM object.
meter = new FancyVoltmeter();
meterThread = new Thread(UpdateMeter);
meterThread.Name = "Meter Thread";
meterThread.Priority = ThreadPriority.Normal;
meterThread.IsBackground = true;
meterThread.Start();
}
private void UpdateMeter()
{
while(true)
{
Thread.Sleep(1000);
if(!meter.IsOpen())
{
// Meter may be powered off here.
// The call to Open takes about 1 second.
// UI hangs during the call???
meter.Open();
}
// code to read meter goes here.
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:也许不清楚我的意思.通过'挂'我应该说'暂时冻结'.
仪表是否需要在 STA 中运行?由于这个原因,对 Open() 的调用实际上是否被编组回 UI 线程?
您可以通过查看调试器中挂起的 UI 线程的调用堆栈来验证这一点是否正确。