线程中AutoResetEvent与ManualResetEvent的区别
线程之间的通信是通过发信号来进行沟通的。、
ManualResetEvent发送Set信后后,需要手动Reset恢复初始状态。而对于AutoResetEvent来说,当发送完毕Set信号后,会自动Reset。
代码差别:
ManualResetEvent
class ThreadClass
{
public static ManualResetEvent Manual1 = new ManualResetEvent(false);
public static ManualResetEvent Manual2 = new ManualResetEvent(false); //手动Reset
static bool m_Err = false;
static List<string> lists;
static int iNum = ;
static void Main(string[] args)
{
lists = new List<string>();
Thread thrd1 = new Thread(new ThreadStart(MethodSecond));
thrd1.Name = "thread Second";
thrd1.Start();
Thread thrd12 = new Thread(() => { MethodFirst(); });
thrd12.Name = "thread First";
thrd12.Start();
}
private static void MethodFirst()
{
while (true)
{
Console.WriteLine("加 开始" + iNum.ToString());
Thread.Sleep();
try
{
for (int x = ; x < iNum; x++)
{
lists.Add(x.ToString());
Console.WriteLine("加:" + x.ToString());
}
}
catch
{
Console.WriteLine("错误");
m_Err = true;
}
Manual2.Set();
Manual2.Reset();//手工Reset
if (m_Err)
{
Manual2.Set();
break;
}
Manual1.WaitOne();
}
}
public static void MethodSecond()
{
Thread tr = Thread.CurrentThread;
while (true)
{
iNum++;
Console.WriteLine("减 等待");
Manual2.WaitOne(); Thread.Sleep(); try
{ if (lists.Count > )
{
jian();
}
}
catch
{
Console.WriteLine("错误");
m_Err = true;
}
Manual1.Set();
Manual1.Reset(); //手工Rest
if (m_Err)
{
Manual1.Set();
break;
}
} }
private static void jian()
{
Thread.Sleep();
Console.WriteLine("减" + lists[]);
lists.RemoveAt();
if (lists.Count > )
{
jian();
}
}
}
AutoResetEvent
class Program
{
public static AutoResetEvent Auto1 = new AutoResetEvent(false);
public static AutoResetEvent Auto2 = new AutoResetEvent(false);
static bool m_Err = false;
static List<string> lists;
static int iNum = ;
static void Main(string[] args)
{
lists = new List<string>();
Thread thrd1 = new Thread(new ThreadStart(MethodSecond));
thrd1.Name = "thread Second";
thrd1.Start();
Thread thrd12 = new Thread(() => { MethodFirst(); });
thrd12.Name = "thread First";
thrd12.Start();
}
private static void MethodFirst()
{
while (true)
{
Console.WriteLine();
Console.WriteLine("加 开始" + iNum.ToString());
Thread.Sleep();
try
{
for (int x = ; x < iNum; x++)
{
lists.Add(x.ToString());
Console.WriteLine("加:" + x.ToString());
}
}
catch
{
Console.WriteLine("错误");
m_Err = true;
}
Auto2.Set();
//Manual2.Reset(); 无需Reset
if (m_Err)
{
Auto2.Set();
break;
}
Auto1.WaitOne();
}
}
public static void MethodSecond()
{
Thread tr = Thread.CurrentThread;
while (true)
{
iNum++;
Console.WriteLine("减 等待"); Auto2.WaitOne();
Thread.Sleep();
try
{
if (lists.Count > )
{
jian();
}
}
catch
{
Console.WriteLine("错误");
m_Err = true;
}
Auto1.Set();
// Manual1.Reset(); //无需Reset
if (m_Err)
{
Auto1.Set();
break;
}
}
}
private static void jian()
{
Thread.Sleep();
Console.WriteLine("减" + lists[]);
lists.RemoveAt();
if (lists.Count > )
{
jian();
}
}
}
线程中AutoResetEvent与ManualResetEvent的区别的更多相关文章
- C#AutoResetEvent和ManualResetEvent的区别
一:终止状态和非终止状态 首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示 ...
- 线程同步 –AutoResetEvent和ManualResetEvent
上一篇介绍了通过lock关键字和Monitor类型进行线程同步,本篇中就介绍一下通过同步句柄进行线程同步. 在Windows系统中,可以使用内核对象进行线程同步,内核对象由系统创建并维护.内核对象为内 ...
- java线程中的sleep和wait区别
面试题:java线程中sleep和wait的区别以及其资 ...
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
[分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...
- 线程同步(AutoResetEvent与ManualResetEvent)
前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...
- c# 多线程编程中AutoResetEvent和ManualResetEvent
作为等同于Java的wait,notify,notifyAll的存在,AutoResetEvent和ManualResetEvent分别实现了notify和notifyAll的功能,下面的代码简单讲解 ...
- java线程中start和run的区别
public class Test1 extends Thread { @Override public void run() { while (true) { System.out.println( ...
- AutoResetEvent与ManualResetEvent区别
本文来自:http://www.360doc.com/content/10/1126/10/3267996_72536817.shtml 在.Net多线程编程中,AutoResetEvent和Manu ...
- 基元线程同步构造 AutoResetEvent和ManualResetEvent 线程同步
在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.ManualResetEvent和AutoResetEvent都 ...
随机推荐
- Spine用于Timeline(NullReferenceException: Object reference not set to an instance of an object pine.Unity.Editor.AnimationReferenceAssetEditor.OnInspectorGUI ())
报错信息:Spine.Unity.Editor.AnimationReferenceAssetEditor.OnInspectorGUI () (at Assets/Extention/Spine/E ...
- 搭建项目(Vue学习笔记一)
一.在搭建Vue项目之前首先要搞明白以下几个问题 1.Vue.js是什么 vue.js是一个脚本库. 2.webpack 模块打包机,分析项目结构,找到JavaScript模块以及其他的一些浏览器不能 ...
- Shell 使用 expr 进行数学运算
1.语法格式: 第一种:expr $num1 operator $num2 第二种:$(($num1 operator $num2)) 2.expr 操作符: 注意:这里比较为true,返回 1.只支 ...
- neutron基础一(网络基本命令)基本命令,包括veth peer
ip addr ip link tcpdump -i veth1 -e -v route -n ip route arp ethtool -S veth0 ip link add type veth ...
- Windows下网页连接VNC操作手册
所需软件:tigervnc noVnc(https://github.com/novnc/noVNC) websockify(https://github.com/novnc/websockify) ...
- python智能提示配置
Package Control 安装方法 1.通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴相应的 Python 安装代码: 2.Sublime T ...
- VmwareTools以及搜狗拼音的安装
已经那么多年工作下来了,结果装linux还是那么 的费劲! 装的是纯净版Ubuntu16.04版本,17.04怕不稳定就没装, 装了发现VmwareTools是暗的,以前也遇到过这个问题,但是真的忘记 ...
- python 发送163邮件
可能还需要使用 邮箱第三方客户端的授权码. 网易163免费邮箱相关服务器信息 from email import encoders from email.header import Header fr ...
- Winscp无法连接linux虚拟机解决
之前需要从主机传文件到虚拟机上,安装了vmware tools,拖拽文件后发现文件总是会损坏一些,查了一下,使用Winscp就不会出现这个问题. 安装好后配置连接:(Centos7) 打开虚拟机,找到 ...
- 在Vuex使用 以及 dispatch和commit来调用mutations的区别
main.js中 import Vuex from 'vuex' Vue.use(vuex); const store = new Vuex.store({ state: { nickName: &q ...