使用LibUsbDotNet做了一个项目,测试的时候测试人员做了一个用例就是快速插拔USB。因为程序中对USB设备的打开和关闭都是在USB通知事件中做的,所以如果USB插拔通知事件不是线程安全的,那么在多线程中关闭和打开设备的顺序就无法保证,因此做了一个小实验来测试是否是线程安全的。
首先需要添加引用:LibUsbDotNet.dll
using LibUsbDotNet; using LibUsbDotNet.DeviceNotify; class Program { //USB插拔通知事件 static IDeviceNotifier DevNotifier; static int n = 0; static void Main(string[] args) { DevNotifier = DeviceNotifier.OpenDeviceNotifier(); DevNotifier.Enabled = true; DevNotifier.OnDeviceNotify += DevNotifier_OnDeviceNotify; while (!Console.KeyAvailable) Application.DoEvents(); } private static void DevNotifier_OnDeviceNotify(object sender, DeviceNotifyEventArgs e) { n++; for(int i=0;i <0xffff;i++) { for (int j = 0; j < n; j++) Console.Write("\t"); Console.WriteLine(i.ToString("X4") + " " + n.ToString()); } } }
运行如下:
控制台输出被覆盖掉了。不过能很明显的看见,当快速插拔USB的时候,是1、2、3、4按顺序执行的。也就是说当多个USB插拔事件发生的时候,事件是线程排队的。因此是线程安全的。
LibUsbDotNet中的USB通知事件是不是线程安全?
时间: 2024-10-10 06:19:55