LibUsbDotNet中的USB通知事件是不是线程安全?

使用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

LibUsbDotNet中的USB通知事件是不是线程安全?的相关文章

【Swing】理解Swing中的事件与线程

talk is cheap , show me the code. Swing中的事件 事件驱动 所有的GUI程序都是事件驱动的.Swing当然也是. GUI程序不同于Command Line程序,一个很大的区别是程序执行的驱动条件:命令行程序是接受用户输入的文本参数,对命令解析,然后通过类似switch的选择来执行不同的功能模块.而GUI程 序就不一样了.GUI程序由界面元素组成,如Button,CheckBox,TextArea,等等.用户操作不同的组件,就会引发不同的事件,然后, 程序编写

Java中事件分发线程(EDT)与SwingUtilities.invokeLater相关总结

前言:这篇文章严格来说不算原创,算是我对这方面知识的一点小结,素材来至其他网友.当然我在我写的C段查询工具也用到了这方面的东西,不过由于代码太多不方便用作事例,因此用了他人的素材总结一下,望理解O(∩_∩)O~ 一 Swing线程基础 一个Swing程序中一般有下面三种类型的线程:    * 初始化线程(Initial Thread)    * UI事件调度线程(EDT)    * 任务线程(Worker Thread)每个程序必须有一个main方法,这是程序的入口.该方法运行在初始化或启动线程

第三十四篇:在SOUI中使用异步通知

概述 异步通知是客户端开发中常见的需求,比如在一个网络处理线程中要通知UI线程更新等等. 通常在Windows编程中,为了方便,我们一般会向UI线程的窗口句柄Post/Send一个窗口消息从而达到将非UI线程的事件切换到UI线程处理的目的. 在SOUI引入通知中心以前要在SOUI中处理非UI线程事件我也推荐用上面的方法. 使用窗口消息至少有以下两个不足: 1.需要在线程中持有一个窗口句柄. 2.发出的消息只能在该窗口句柄的消息处理函数里处理. SNotifyCenter 最新的SOUI引入了一个

使用泛型SwingWorker与EDT事件分发线程保持通讯

为什么要使用SwingWorker 在swing开发中,如果一个应用程序,执行一些任务,需要大量的时间来完成,比如下载一个大文件或执行一个复杂的数据库查询. 我们假设这些任务是由用户使用一个按钮触发的.在单线程应用程序,用户单击按钮,进入计算的过程,然后等待任务完成之前,所有的事件都在主线程EDT线程进行. 但如果某些任务耗时很长,用户将甚至不能在中途取消任务,应用程序必须响应只有当长任务完成.不幸的是,许多应用程序显着这样的行为和用户感到沮丧,程序仿佛卡死一样. 多线程可以解决这个问题.它使应

线程系列09,线程的等待、通知,以及手动控制线程数量

当一个线程直到收到另一个线程的通知才执行相关的动作,这时候,就可以考虑使用"事件等待句柄(Event Wait Handles)".使用"事件等待句柄"主要用到3个类: AutoResetEvent, ManualResetEvent以及CountdownEvent(.NET 4.0以后才有).本篇包括: ※ 一个线程等待另一个线程的通知※ 2个线程互相通知等待※ 一个线程等待队列中的多个任务通知※ 手动控制线程的数量 □ 一个线程等待另一个线程的通知 最简单的情景

Android中的消息通知(NotificationManager和Notification)

下面来谈谈notification,这个notification一般用在电话,短信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这个快讯.已添加的Notification.Builder,使其更容易构建通知.notification是一种让你的应用程序在没有开启情况下或在后台运行警示用户.它是看不见的程序组件(Broadcast Receiver,Service和不活跃的Activity)警示用户有需要注意的事件发生的最好途径.

RxJava中的doOnSubscribe操作符默认执行线程分析

前言 在有心课堂<RxJava之旅>中有学员留言:map和doOnSubscribe默认调度器是IO调度器,这里说错了吧? 下面我们分析下. 在前面讲 Subscriber 的时候,提到过 Subscriber 的 onStart() 可以用作流程开始前的初始化.然而 onStart() 由于在 subscribe() 发生时就被调用了,因此不能指定线程,而是只能执行在 subscribe() 被调用时的线程.这就导致如果 onStart() 中含有对线程有要求的代码(例如在界面上显示一个 P

Java多线程开发系列之番外篇:事件派发线程---EventDispatchThread

事件派发线程是java Swing开发中重要的知识点,在安卓app开发中,也是非常重要的一点.今天我们在多线程开发中,穿插进来这个线程.分别从线程的来由.原理和使用方法三个方面来学习事件派发线程. 一.事件派发线程的前世今生 事件(Event)派发(Dispatch)线程(Thread)简写为EDT,也就是各个首字母的简写.在一些书或者博客里边也将其译为事件分发线程.事件调度线程.巴拉巴拉,总之,知道这些名字就行.笔者认为这里翻译成派发更准确点. 熟悉Swing和awt编程的小伙伴对事件派发线程

C#中WinForm控件的跨线程更新Invoke

目的: 用WinForm(C#)搭建一个用户界面,一个进度条和一个按钮,按钮启动进度条,进度完成时停止更新 示例: 实现: 在按钮事件中设置循环,更新进度条         private void btnProgress_Click(object sender, EventArgs e)         {             for (int ii = 0; ii < 100; ii++)             {                 progressBar1.Value