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

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. Springboot 的错误处理功能的实现

    一.页面的形式返回 直接在resources的目录下创建public/error的路径,然后创建5xx.html或者4xx.html文件,如果出错就会自动跳转的相应的页面. 二.cotroller的形 ...

  2. URL和URL比较

    浅谈URI和URL URI(Uniform Resource Identifier)字面上的意思是,统一资源标示符 URL(Uniform Resource Locator),统一资源定位符 光从字面 ...

  3. python 3 字符编码解码问题

    python2与python3 字符编码都做了很大的调整,区别: 1.python2字符串默认有两种类型,unicode和str.'你好' !=u'你好' python3字符串默认只有str一种类型, ...

  4. grafana 安装配置

    Grafana安装配置 1.下载安装包 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.1.3.l ...

  5. python基础—购物车小程序练习

    要求:顾客可以根据商品编号购买工资允许内的商品,购买完成后,打印购买列表. def main(): salary = input("what is your salary ?") ...

  6. SpringBoot+POI报表批量导出

    由于servletResponse 获取的输出流对象在一次请求中只能输出一次,所以要想实现批量导出报表,需要将excel文件打包成zip格式然后输出. 好了,废话不多说,上代码. 1. 首先,需要导入 ...

  7. github项目

    一.github项目地址: https://github.com/fairy1231/gitLearning/tree/master 二.github的重要性: Git 是一个快速.可扩展的分布式版本 ...

  8. python接口测试-将运行结果写入Excel表格

    公司工作是促进学习的第一生产力!! 一个get请求的接口,我想清楚的在Excel中看到所有的数据! 带着学过H5,php觉得所有代码都很简单的自信,在公司开发的[鼓励]下开始了一上午的斗争 一个小时. ...

  9. python自动化框架(一)

    一.jsonpath难点分析 dic = { "error_code": 0, "stu_info": [ { "id": 2057, &q ...

  10. React项目中跨域问题的解决方案

    刚刚找到到通过creat-react-app创建的项目中跨域问题的解决方案,记录下来以备后用. 如果接口地址为:    http://my.example.com/eg-api  则配置package ...