EventWaitHandle

继承:Object->WaitHandle-> EventWaitHandle
派生:System.Threading.AutoResetEvent\System.Threading.ManualResetEvent

AutoResetEvent、 ManualResetEvent只能在进程内使用。semaphore、mutex可以跨进程和线程使用。

使用内核对象记得及时释放句柄和对象。要不会造成内存浪费。

方法:

  1. public static System.Threading.EventWaitHandle OpenExisting (string name);

1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在

  1. public static bool TryOpenExisting (string name, out System.Threading.EventWaitHandle? result);

1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在,存在返回true。

AutoResetEvent

只能在进程内使用。

创建自动事件的2种方式:
  1、EventWaitHandle clearCount = new EventWaitHandle(false, EventResetMode.AutoReset);
  2、AutoResetEvent are =new AutoResetEvent(true);//默认打开自动砸门,它自能唤醒一个阻塞线程,在解除第一个阻塞后,内核将事件重置为false,所以第一次waitone()不会阻塞,第二次会阻塞。

方法:

1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在

 用AutoResetEvent实现一个类似于metux的锁。

  1. AutoMutex am=new AutoMutex();
  2. for (int i = 0; i < 10; i++)
  3. {
  4. new Thread(() => {
  5. am.Enter();
  6.  
  7. Thread.Sleep(1000);
  8. am.Release();
  9.  
  10. }).Start();
  11. }
  12.  
  13. class AutoMutex
  14. {
  15.  
  16. static AutoResetEvent are =new AutoResetEvent(true);
  17. static int lockOwner=-1;//当前锁的拥有者
  18. static int recursionCount=-1;//迭代计数器
  19.  
  20. public void Enter()
  21. {
  22. int currentcount = Environment.CurrentManagedThreadId;
  23. if (lockOwner == currentcount)
  24. {
  25.  
  26. recursionCount++;
  27. return;
  28. }
  29.  
  30. are.WaitOne();
  31. Console.WriteLine("Current Thread{0}", Environment.CurrentManagedThreadId);
  32. recursionCount = 1;
  33. lockOwner = currentcount;
  34. }
  35. public void Release()
  36. {
  37. if (lockOwner == Environment.CurrentManagedThreadId) return;
  38. if(--recursionCount == 0)
  39. {
  40. are.Set();
  41. lockOwner = -1;
  42. }
  43.  
  44. }
  45.  
  46. public void Dispose()
  47. {
  48.  
  49. are.Close();
  50. are.Dispose();
  51. }
  52.  
  53. }

ManualResetEvent

只能在进程内使用。

创建手动事件的2种方式:
  1\EventWaitHandle clearCount =new EventWaitHandle(false, EventResetMode.ManualReset);
  2\ManualResetEvent  are =new  ManualResetEvent(true);//默认打开自动砸门,所以 waitone()不会阻塞,必须手动关闭。

方法:

1、EventWaitHandle.OpenExisting(String eventName) 静态方法,跨进程使用。判段已知的名称的自动事件是否存在

C# Event 内核构造 |EventWaitHandle、AutoResetEvent、 ManualResetEvent的更多相关文章

  1. 【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent

    AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...

  2. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  3. AutoResetEvent ManualResetEvent WaitOne使用注意事项

    公司还用这些老家伙没办法,用了几次这俩.每次用都要重新翻一下A片. 好好的A片楞是翻译成了禅经.把这东西弄成个玄学.微软也是吃枣药丸.参考了@风中灵药的blog.写的牛逼. 还有一些公司用到的风中灵药 ...

  4. [.net 多线程]AutoResetEvent, ManualResetEvent

    ManualResetEvent: 通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源. Set() : 用于向 ManualResetEvent 发送信号 ...

  5. linux内核构造skb发包-----raw、tcp网络编程

    1. 内核raw发包 #include <linux/init.h>#include <linux/module.h> #include <linux/kernel.h& ...

  6. C#线程学习笔记五:线程同步--事件构造

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...

  7. .NET中的线程与异步(笔记)

    翻出了之前记录的笔记,基本涵盖了.NET中线程和异步的相关概念.可以提供一个学习的方向. 线程类型 工作者线程IO线程 线程池 全局队列(QueueUserWorkItem.Timer总是放入全局)本 ...

  8. Daemon,Jos,定时器

    --> FileSystemWatcher--> EventWaitHandle / AutoResetEvent / ManualResetEvent--> Mutex--> ...

  9. 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent

    本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...

随机推荐

  1. 前端3D引擎-Cesium自定义动态材质

    本文代码基于Vue-cli4和使用WebGL的地图引擎Cesium,主要内容为三维场景下不同对象的动态材质构建. 参考了很多文章,链接附在文末. 为不同的几何对象添加动态材质 不知道这一小节的名称概况 ...

  2. HttpServletRequest接口详解

    般情况下,浏览器(客户端)通过 HTTP 协议来访问服务器的资源,Servlet 主要用来处理 HTTP 请求.Servlet 处理 HTTP 请求的流程如下: Servlet 容器接收到来自客户端的 ...

  3. golang中gomodule讲解

    0. GOMODULES模式 1. GOPATH的缺点 1. 无版本控制概念 2. 无法同步一致第三方版本号 3. 无法指定当前项目引用的第三方版本号 2. go1.11版本之后可以使用GoModul ...

  4. docker四种模式

    1 host模式众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,MountNamespace隔离文件系统,Network Name ...

  5. linux虚拟机xshell安装

    目录 一:虚拟机安装 二:配置windows网络 三:linux操作系统安装 四:xshell安装使用 一:虚拟机安装 1.双击虚拟机软件 ---> 下一步 直至安装完毕 2.安装Linux操作 ...

  6. python网络爬虫-入门(二)

    为什么要学网络爬虫 可以替代人工从网页中找到数据并复制粘贴到excel中,这种重复性的工作不仅浪费时间还一不留神还会出错----解决无法自动化和无法实时获取数据     对于这些公开数据的应用价值,我 ...

  7. Flink源码学习笔记(3)了解Flink HA功能的实现

    使用Flink HA功能维护JobManager中组件的生命周期,可以有效的避免因为JobManager 进程失败导致任务无法恢复的情况. 接下来分享下 Flink HA功能的实现 大纲 基于Zook ...

  8. python 小兵(12)模块1

    序列化 我们今天学习下序列化,什么是序列化呢? 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 为什么要有序列化模块: 比如,我们在python代码中计算的一个数据需要给另外一段程序使用 ...

  9. Vue之 watch、computed、filter之间的区别与使用场景

    computed  计算属性: 当页面中需要使用大量的表达式处理数据时,为了页面维护更加简单,所以使用 计算属性 来出来复杂的逻辑运算 watch 侦听器 当需要在数据变化时执行异步或开销较大的操作时 ...

  10. HOW2J 全套教程整理:Java、前端、数据库、中间件、第三方、项目、面试题

    考虑到部分同学寝室会断网,原站的所有的免费内容都提供了一个离线版本以供使用.但是它直接提供了静态页面,并不方便在手机上阅读,因为我将其转换为 EPUB. 目录 HOW2J J2EE 教程.epub H ...