线程之间的通信是通过发信号来进行沟通的。、

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的区别的更多相关文章

  1. C#AutoResetEvent和ManualResetEvent的区别

    一:终止状态和非终止状态 首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示 ...

  2. 线程同步 –AutoResetEvent和ManualResetEvent

    上一篇介绍了通过lock关键字和Monitor类型进行线程同步,本篇中就介绍一下通过同步句柄进行线程同步. 在Windows系统中,可以使用内核对象进行线程同步,内核对象由系统创建并维护.内核对象为内 ...

  3. java线程中的sleep和wait区别

                                                                            面试题:java线程中sleep和wait的区别以及其资 ...

  4. 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)

    [分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...

  5. 线程同步(AutoResetEvent与ManualResetEvent)

    前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...

  6. c# 多线程编程中AutoResetEvent和ManualResetEvent

    作为等同于Java的wait,notify,notifyAll的存在,AutoResetEvent和ManualResetEvent分别实现了notify和notifyAll的功能,下面的代码简单讲解 ...

  7. java线程中start和run的区别

    public class Test1 extends Thread { @Override public void run() { while (true) { System.out.println( ...

  8. AutoResetEvent与ManualResetEvent区别

    本文来自:http://www.360doc.com/content/10/1126/10/3267996_72536817.shtml 在.Net多线程编程中,AutoResetEvent和Manu ...

  9. 基元线程同步构造 AutoResetEvent和ManualResetEvent 线程同步

    在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.ManualResetEvent和AutoResetEvent都 ...

随机推荐

  1. asp.net core 实战项目(一)——ef core的使用

    数据库设计 数据结构图如下:   此次实例比较简单,暂时只设计到上述3张表 SMUser:用于存储用户信息. Role:用于存储角色信息. SMUser_Role:用建立用户和角色关系的一直关联表. ...

  2. 安装linux虚拟机配置静态ip(桥接模式)

    1.centOs7.VMware Workstation14 2.常规新建虚拟机操作后,来到选择连接模式: 这里选择桥接模式,复制物理网络连接状态(就是把实际的主机网卡信息拷贝一份,让虚拟机也有一份和 ...

  3. JS快排

  4. JS调用本地设备

    JS 允许通过 navigator.mediaDevices.getUserMedia(options) 直接调用本地的设备,比如麦克风,摄像头等.因为该操作涉及到用户隐私,所以调用的时候会弹框请求权 ...

  5. 1. 做node项目 (第二个月)

    工作栈: Node + Express + Mongoose +  Mongodb + Vuejs 主要做了 mongodb的 curd , 因为以前做 PHP + MySql 所以基本大同小异. n ...

  6. [转载]Fiddler 解析!抓包抓得好真的可以为所欲为 [一]

    说起抓包,很多人以为就是用个工具,简简单单地抓一下就可以了.昨天在面试一个安卓逆向,直接告诉我[抓包没有技术含量].在这里,我必须发一个教程,解析一下抓包神器——Fiddler.Fiddler仅仅是一 ...

  7. java编码与解码(一)

    转:https://blog.csdn.net/heyanxi0101/article/details/80356870 java编码与解码(一) 编码表概述和常见的编码表 概述:有字符及其对应的数值 ...

  8. Java学习笔记(9)

    lambda表达式: 只定义了单个方法的接口,称为单一抽象方法(Single Abstract Method, SAM)接口:由于此接口通过调用,完成某一功能,所以也称为功能接口,此类接口的实例称为功 ...

  9. erlang link 与 monitor

    erlang设计中,通常会有这样一个需求: 某一个进程必须依赖于令一个进程的概念,在这样的情况下就必须对两个进程之间建立一个监控或者说连接关系,以监听对方的死亡情况. erlang 提供了两个这样的方 ...

  10. Dapp混合模型开发--Dice2win的解读

    前言: 之前讲到Dapp原生态对随机函数的支持并不友好, 现在讲讲一种解决思路. 既能保证随机函数的不可预测性, 又能保证公平性, 平台和玩家都能满意. 而Dapp中的Dice2Win实现, 刚好是其 ...