c# - 在 C# 中检测 USB 设备的插入和移除

标签 c# usb backgroundworker

我尝试了此线程中的一种解决方案 Detecting USB drive insertion and removal using windows service and c# .但由于对 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 线程访问它们。您必须使用委托(delegate)来处理 BackgroundWorker 中的 GUI 元素。例如:

    GUIobject.Dispatcher.BeginInvoke(
        (Action)(() => { string value = myTextBox.Text; }));

在 RunWorkerCompleted 上,您仍在尝试从 BackGroundWorker 访问 GUI 元素。

关于c# - 在 C# 中检测 USB 设备的插入和移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975946/

相关文章:

macos - OS X 上平移/倾斜的 UVC(USB 视频设备类)控制

linux - 在 pppd 连接时向 USB 3G 调制解调器发送 AT 命令

c# - 使用 while 循环取消 backgroundworker

c# - 如何在 C# 中执行 DragAcceptFiles?

linux - 有没有办法在 Linux 上检查 3G 速度连接?

c# - 在后台 worker 错误中更改标签文本

c# - 避免不同类中使用的相似背景 worker 的代码重复

c# - 如何使用 linq 做到这一点?

c# - 记录(通过 Serilog)到 ElasticSearch 不起作用

c# - 在不知道主键的情况下插入多个表