C# Hidlibrary事件线程

C# Hidlibrary事件线程,c#,events,hid,C#,Events,Hid,我正在使用mikeobriens Hidder库与我们制造的传感器进行通信 这一切都在工作,我有它,所以它重新枚举,如果设备拔下,然后重新连接 我遇到的问题是,每次重新连接时,都会创建一个新的HidLibrary.HidDeviceEventMonitor.DeviceEventMonitor工作线程,如果系统长时间像这样运行,就会创建许多线程。当设备断开连接时,我如何杀死这些线程?我相信如果HidLibrary出现了一种错误 如果仔细查看HidDevice类,您可能会发现HidDevice.C

我正在使用mikeobriens Hidder库与我们制造的传感器进行通信

这一切都在工作,我有它,所以它重新枚举,如果设备拔下,然后重新连接


我遇到的问题是,每次重新连接时,都会创建一个新的HidLibrary.HidDeviceEventMonitor.DeviceEventMonitor工作线程,如果系统长时间像这样运行,就会创建许多线程。当设备断开连接时,我如何杀死这些线程?

我相信如果HidLibrary出现了一种错误

如果仔细查看HidDevice类,您可能会发现HidDevice.CloseDevice实际上并没有停止事件监视

有两种方法可以解决这个问题。 在应用程序中调用Dispose而不是CloseDevice:

//_device.CloseDevice(); - dispose will close device automatically
_device.Dispose();
或在CloseDevice调用后将MonitorDeviceEvents标志设置为false:

_device.CloseDevice();
_device.MonitorDeviceEvents = false;
我更喜欢第一个


注意:还要确保您没有保留对断开设备的引用

我相信如果隐藏库存在一种bug

如果仔细查看HidDevice类,您可能会发现HidDevice.CloseDevice实际上并没有停止事件监视

有两种方法可以解决这个问题。 在应用程序中调用Dispose而不是CloseDevice:

//_device.CloseDevice(); - dispose will close device automatically
_device.Dispose();
或在CloseDevice调用后将MonitorDeviceEvents标志设置为false:

_device.CloseDevice();
_device.MonitorDeviceEvents = false;
我更喜欢第一个


注意:还要确保您没有保留对断开设备的引用

这对我不起作用,因为我正在使用阻塞呼叫设备.ReadReport(AddressOf OnReport)。如果我只是简单地将设备设置为NULL(以消除引用),那么下一次扫描将抛出一个异常

为了解决这个问题,我做了如下工作:

Public Class myDevice
Private Device As HidDevice
Private isConnected as Boolean

Public Sub Close()
    If Not Device Is Nothing Then
        Device.CloseDevice()
        Device.MonitorDeviceEvents = False
    End If
    isConnected = False
End Sub

Sub OnReport(Report As HidReport)
    If isConnected = False Then
        Device.Dispose()
        Device = Nothing
        Return
    End If
    ' Do stuff with the data
    ' ...
    ' ...
    ' Wait for more data.
    Device.ReadReport(AddressOf OnReport)
End Sub
End Class

因此,在关闭设备后,线程仍处于等待输入的状态。但是我设置了一个标志来指示设备已关闭(device.isConnected对我不起作用,因此我创建了自己的标志)。关闭的线程接收到的下一个事件检测到设备不再“连接”,因此它处理设备,取消引用设备,并返回,而不调用ReadReport

这对我不起作用,因为我正在使用阻塞调用设备.ReadReport(AddressOf OnReport)。如果我只是简单地将设备设置为NULL(以消除引用),那么下一次扫描将抛出一个异常

为了解决这个问题,我做了如下工作:

Public Class myDevice
Private Device As HidDevice
Private isConnected as Boolean

Public Sub Close()
    If Not Device Is Nothing Then
        Device.CloseDevice()
        Device.MonitorDeviceEvents = False
    End If
    isConnected = False
End Sub

Sub OnReport(Report As HidReport)
    If isConnected = False Then
        Device.Dispose()
        Device = Nothing
        Return
    End If
    ' Do stuff with the data
    ' ...
    ' ...
    ' Wait for more data.
    Device.ReadReport(AddressOf OnReport)
End Sub
End Class

因此,在关闭设备后,线程仍处于等待输入的状态。但是我设置了一个标志来指示设备已关闭(device.isConnected对我不起作用,因此我创建了自己的标志)。关闭线程接收到的下一个事件检测到设备不再“连接”,因此它处理设备,取消引用设备,并返回,而不调用ReadReport

花点时间解释您的情况..发布您尝试过的代码…预期输出..Jagadeesh,代码是在HIDLibrary中提供的,未经修改。花点时间解释您的情况。发布您尝试过的代码…预期输出内容。Jagadeesh,代码是在HIDLibrary中提供的,未经修改。修复了它,谢谢修复了它,谢谢