Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c语言中检测usb设备的插入和删除#_C#_Usb_Backgroundworker - Fatal编程技术网

C# 在c语言中检测usb设备的插入和删除#

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

我在这个线程中尝试了一种解决方案。但我仍然会出错,因为对windows窗体控件的线程不安全调用

这是我的密码

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示例中:不需要使用委托。现在正确的解决方案是什么?