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

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. 使用EFCore处理并发冲突

    一.首先添加并发处理标记 在需要进行并发处理的类中添加版本号,并在版本号上使用[Timestamp]标记: public class Department { public int Id { get; ...

  2. KendoUi 学习笔记一

    本系列主要是记录KendoUI的学习过程. KendoUi的特点有以下特点: 1. 70+UI控件 控件有DataGrids,DropDowns,Menus和Buttons,还有一些商业的控件,比如C ...

  3. Beta冲刺 2

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10104842.html 作业博客:https://edu.cnblogs.com/campus ...

  4. Linux中彻底删除Google-Chrome浏览器

    sudo apt-get autoremove --purge google-chrome-stable   卸载chrome后, 删除-/.config/google-chrome,重新安装.

  5. [转载] java多线程总结(二)

    转载自:http://www.cnblogs.com/lwbqqyumidi/p/3817517.html 作者:Windstep 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几 ...

  6. js循环出相同name,不同id的按钮,对其进行点击回复操作

    function getseat(){ var option= "<button class='btn'style='margin:5px;' onclick='onclickSeat ...

  7. [转] Springboot的数据库操作

    转载自:https://www.cnblogs.com/juncaoit/p/7789034.html springBoot的数据库操作 一:操作数据库起步 1.Spring-Data-Jpa JPA ...

  8. WEB学习笔记11-高可读性的HTML之如何设置网页标题层级

    标题标签指的是<h1>~<h6>这6个标签,统称为<hx>标签. (1)在页面内容的标题部分使用<hx>标签 <h1 class="re ...

  9. phpexcel 使用说明

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  10. IOS 生成静态库文件(.a文件)

    http://www.cnblogs.com/lyy-5518/p/5459643.html