我认为您正在尝试解决两个不同的问题。
第一个是如何防止主 (UI) 线程访问未初始化的 USB 设备。另一个是处理“请稍候”微调器对话框。
我的建议是:
- 继续
BackgroundWworker
处理 USB 设备初始化。
向您的类添加一个布尔字段,以标记 USB 设备何时完成初始化,例如
private volatile bool _usbDeviceInited = false;
您的后台工作人员要做的最后一件事就是将此标志设置为true
.
- 通过属性集中访问 USB 设备。如果 USB 初始化尚未完成,getter 方法可以检查布尔字段并返回空值(或者如果您愿意,可以引发异常)。
- 修改您的代码以检查是否由授予对 USB 设备的访问权限的属性返回 null(或处理异常,如果您选择引发一个),这意味着它尚未准备好使用。您可以处理此情况以提醒用户 USB 设备未准备好。
前面的步骤是解决第一个问题的一种方法。现在,对于微调器。
我建议订阅RunWorkerCompleted
你的事件BackgroundWorker
。如果您BackgroundWorker
是从主 UI 线程创建的,则该事件将在主 UIThread 中触发(这意味着与用户界面元素交互是安全的)。从那里您可以简单地关闭并处理您的“请稍候”对话框。您还应该检查该AsyncCompletedEventArgs.Error
属性以确保在初始化 USB 设备时没有从 BackgroundWorker 线程引发错误情况。
编辑:
我刚刚读到您的应用程序可能会运行一个立即尝试访问 USB 设备的脚本。使用我建议的模式,您可以在运行脚本之前“轮询”属性,直到它返回一个不同于 null 的值,如下所示:
bool timedOut = false;
DateTime timeout = DateTime.Now.AddSeconds(timeoutSeconds);
while ( MyClass.MyUsbDevice == null ) {
if( DateTime.Now > timeout ) {
timedOut = true;
break;
}
Thread.Sleep(0); // Avoid pegging the CPU, yield it to other processes
}
if( !timedOut ) {
// run the script
} else {
// Handle timeout
}
祝你好运!