C# 线程同步之事件信号阻塞 AutoResetEvent
时间:2022-07-24
本文章向大家介绍C# 线程同步之事件信号阻塞 AutoResetEvent,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
AutoResetEvent可以在线程与线程间传递信号,来告知其他线程自己已经完成某一阶段的任务。
两个AutoResetEvent实例的初始状态都是unsignaled。 调用任何一个WaitOne都会阻塞,直到Set。
如果初始状态(new时给了true)为Signaled,则WaitOne会立刻执行,然后自动切换回unsignaled
AutoResetEvent采用内核时间模式,等待时间不能太长。 这能被更好的ManualResetEventslim类替换,因为它是混合模式。
下方输出结果:
1等待另一个线程完成工作 2开始一个长期工作 3工作完成 4等待中线程完成它的工作 5第一阶段工作完成 6在主线程上做了些操作 7现在开始由第二线程执行第二阶段 8开始第二阶段 9工作完成 10工作全部完成
private static AutoResetEvent _workerEvent = new AutoResetEvent(false);
private static AutoResetEvent _mainEvent = new AutoResetEvent(false);
static void Process(int seconds)
{
Console.WriteLine("2开始一个长期工作");
Thread.Sleep(seconds);
Console.WriteLine("3工作完成");
Console.WriteLine("4等待中线程完成它的工作");
_workerEvent.Set();
_mainEvent.WaitOne();
Console.WriteLine("8开始第二阶段");
Thread.Sleep(seconds);
Console.WriteLine("9工作完成");
_workerEvent.Set();
}
static void Main(string[] args)
{
var t = new Thread(() => Process(10));
t.Start();
Console.WriteLine("1等待另一个线程完成工作");
_workerEvent.WaitOne();
Console.WriteLine("5第一阶段工作完成");
Console.WriteLine("6在主线程上做了些操作");
Thread.Sleep(5);
Console.WriteLine("7现在开始由第二线程执行第二阶段");
_mainEvent.Set();
_workerEvent.WaitOne();
Console.WriteLine("10工作全部完成");
Console.ReadLine();
}
- Core-periphery decomposition--核心-外围模型R代码整理
- 停止数据库没有响应的问题分析(r9笔记第51天)
- Hive——巧用transform处理复杂的字符串问题
- 停止数据库没有响应的问题分析(r9笔记第50天)
- 一个SQL语句引发的ORA-00600错误排查(一) (r9笔记第64天)
- 一个SQL语句引发的ORA-00600错误排查(二)(r9笔记第65天)
- 关于all_procedures的问题分析 (r9笔记第61天)
- 半自动化搭建Data Guard的想法和实践(一) (r9笔记第74天)
- Go语言位操作实例
- 通过Snapshot Standby来精确评估SQL性能 (r9笔记第73天)
- mongodb11天之屠龙宝刀(三)基本操作:增删改查与mysql对比
- Go语言 实现bitmap
- 最近的几个技术问题总结和答疑(八) (r9笔记第72天)
- Java基础-day05-代码题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux ssh端口转发的三种方式
- 学习Centos7软raid5的挂载
- linux中crw brw lrw等等文件属性是什么
- centos中文件与权限的基本操作教程
- 在Linux中使用tcpdump命令捕获与分析数据包详解
- easyswoole一键安装脚本及宝塔安装错误问题
- CentOS7系统增加swap的操作方法实例
- iOS逆向之OpenSSH登录iPhone
- linux中SUID,SGID与SBIT的奇妙用途详解
- 详解Linux文件操作知识点
- Linux中nohup与&的用法和区别详解
- Linux中有效地管理进程的8个命令
- Centos7 下安装python3及卸载的教程
- Linux使用VIM编辑器的方法
- Centos安装MYSQL8.X的教程