线程学习笔记(EventWaitHandler)AutoResetEvent的使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ConsoleApplication46
{
class TwoWaySignaling
{
//事件等待句柄
static EventWaitHandle _ready = new AutoResetEvent(false);
static EventWaitHandle _go = new AutoResetEvent(false);
static readonly object _locker = new object();
static string _message; static void Main()
{
new Thread(Work).Start();
// 首先等待工作线程就绪
//(一直的连续的_go.set,会使得work里的_go.waitone来不及处理致使信号被淹没,为了使得信号不被淹没,
每次go发信号前必须用另一个信号_ready在work中发射(通过设置_ready.set()),主线程则只有等待到_ready的发射信号后才能使用go反射信号
_ready.WaitOne();//当接收到信号后才能往下执行代码
lock (_locker) _message = "ooo";
_go.Set(); // 通知工作线程执行 _ready.WaitOne();
lock (_locker) _message = "ahhh"; // 给工作线程其它信息
_go.Set();
_ready.WaitOne();
lock (_locker) _message = null; // 发信号通知工作线程退出
_go.Set(); Console.ReadKey();
} static void Work()
{
while (true)
{
//这里ready发射信号,让主线程阻塞,等待主线程接收到ready的发射信号后(_ready.waitone等待会阻塞)
go再发射信号,否则go的信号会因为来不及处理而被淹没,之后在主线程的_ready调用_ready_waitone等待阻塞结束后,才让_go调用_go.set()继续发射信号,使得工作线程work更新控制台的输出)
_ready.Set(); // 表示我们准备好了
_go.WaitOne(); // 等待开始 .set()是发射信号,.WaitOne()则是等待信号
lock (_locker)
{
if (_message == null) return; // 优雅地退出
Console.WriteLine(_message);
}
}
}
}
}
线程学习笔记(EventWaitHandler)AutoResetEvent的使用的更多相关文章
- Linux进程线程学习笔记:运行新程序
Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...
- C#线程学习笔记九:async & await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
- C#线程学习笔记五:线程同步--事件构造
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...
- C#线程学习笔记六:线程同步--信号量和互斥体
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用. ...
- C#线程学习笔记四:线程同步
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html,记录一下学习过程以备后续查用. ...
- C#线程学习笔记三:线程池中的I/O线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/20/MultiThreads.html,记录一下学习过程以备后续查用. 一.I/O线 ...
- C#线程学习笔记二:线程池中的工作者线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/ThreadPool.html,记录一下学习过程以备后续查用. 一.线程池基础 首先,创 ...
- C#线程学习笔记一:线程基础
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习过程以备后续查用. 一.线程的介绍 进程(Proce ...
- C#线程学习笔记
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习,方便后面资料查找 一.线程的介绍 进程(Proce ...
随机推荐
- Hbase客户端API基础小结笔记(未完)
客户端API:基础 HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无 ...
- iOS 关于GCD中的队列
GCD中队列分类及获得方式 1.串行队列 dispatch_queue_t queue = dispatch_queue_create("队列名", DISPATCH_QUEUE ...
- yum 部署nginx
第一步,在/etc/yum.repos.d/目录下创建一个源配置文件nginx.repo: cd /etc/yum.repos.d/ vim nginx.repo 填写如下内容: [nginx ...
- 栅格数据处理 RasterDataset RasterLayer Raster RasterBandCollection
1 IRasterLayer myrasterlayer = MapControl.Map.Layer[index] as IRasterLayer;2 IRaster myRaster = myra ...
- Distributed Transaction Coordinator 无法启动
有时候我们需要进行COM应用程序的权限设置,控制面板-->管理工具-->组件服务-->然后依此展开:组件服务-->计算机-->我的电脑-->DCOM 配置,接下来找 ...
- IMX6 PCA9698应用层读写库
.c #include <stdio.h> #include <string.h> #include <linux/types.h> #include <st ...
- dedecms代码研究四
partview php文件之前,我们像掉进沼泽一样,看到无尽的变量,数组元素,莫名其面的东西摆在我们面前.今天,我们继续艰难前行,想办法走出partview类的泥潭.上一篇,我们胡乱分析了partv ...
- yum命令指南
yum check-update 检查可更新的所有软件包 yum update 下载更新系统已安装的所有软件包yum upgrade 大规模的版本升级,与yum update不同的是,连旧的淘汰 ...
- 43. studio上的json串解析
var doc = O_PARAMETER.FJSonStr;(doc为:{"items":[],"nextId":0}) //1.先转为json对象,主要有以 ...
- AS
1.修改注释模板: “File“->“Settings” File and Code Templates 然后选中Includes tab下面的File Header. 2.代码提 ...