C# 在c语言中检测usb设备的插入和删除#
我在这个线程中尝试了一种解决方案。但我仍然会出错,因为对windows窗体控件的线程不安全调用 这是我的密码C# 在c语言中检测usb设备的插入和删除#,c#,usb,backgroundworker,C#,Usb,Backgroundworker,我在这个线程中尝试了一种解决方案。但我仍然会出错,因为对windows窗体控件的线程不安全调用 这是我的密码 private void initWatchers() { WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'"); ManagementEventWat
private void initWatchers()
{
WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
insertWatcher.Start();
WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
removeWatcher.Start();
}
在事件处理程序中,我启动了backgroundworker
private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
backgroundworker完成后,我确实可以访问windows窗体中的控件
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// access some controls of my windows form
}
所以现在我仍然会因为不安全的控件调用而出错。知道为什么吗?这是因为GUI元素位于应用程序的GUI线程中,您正试图从BackGroundWorker线程访问它们。您必须使用委托来处理来自BackgroundWorker的GUI元素。例如:
GUIobject.Dispatcher.BeginInvoke(
(Action)(() => { string value = myTextBox.Text; }));
在RunWorkerCompleted上,您仍在尝试从BackGroundWorker访问GUI元素。但是在这里的backroundworker示例中:不需要使用委托。现在正确的解决方案是什么?