ManualResetEvent和AutoResetEvent的作用可以理解为在线程执行中插入停顿点flag终止程序运行,然后通过设置flag的状态来使得程序继续运行。

两者的区别是:ManualResetEvent设置flag状态为可以运行后,所有在终止点的程序都可以继续运行;AutoResetEvent设置flag状态后,只会有一个程序继续运行(如果AutoResetEvent设置的flag有100个程序在等待,那flag开始状态必须要设置100次才能使得所有的线程都执行完毕)

示例如下(ManualResetEvent时会同时执行三个线程,AutoResetEvent则会依次执行):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data; public class Example
{ /// <summary> /// 预备信号,准备发送,初始化 /// </summary> public EventWaitHandle flag;
public void Begin()
{
//flag = new ManualResetEvent(false);
flag = new AutoResetEvent(false);
Thread th1 = new Thread(() =>
{
flag.WaitOne();
Thread.Sleep();
Console.WriteLine("第一个线程已经通过……");
flag.Set(); }); Thread th2 = new Thread(() =>
{
flag.WaitOne();
Thread.Sleep();
Console.WriteLine("第二个线程已经通过……");
flag.Set(); }); Thread th3 = new Thread(() =>
{
flag.WaitOne();
Thread.Sleep();
Console.WriteLine("第三个线程已经通过……");
flag.Set(); }); th1.IsBackground = true;
th1.Start();
th2.IsBackground = true;
th2.Start();
th3.IsBackground = true;
th3.Start();
flag.Set();
Thread.Sleep(); Console.WriteLine("A");
Console.WriteLine("B"); } static void Main(string[] args)
{
new Example().Begin();
Console.ReadKey();
}
}

ManualResetEvent和AutoResetEvent的区别实例的更多相关文章

  1. ManualResetEvent和AutoResetEvent的区别

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

  2. ManualResetEvent和AutoResetEvent的区别,分享来的

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

  3. 【C#】【Thread】ManualResetEvent和AutoResetEvent区别

    ManualResetEvent和AutoResetEvent主要用于线程之间同步问题. 主要使用方法有Set();Reset();WaitOne(); Set():将事件状态设置为终止状态,允许一个 ...

  4. C# ManualResetEvent和AutoResetEvent 使用笔记

    一.两者区别 1.ManualResetEvent 调用一次Set()后将允许恢复所有被阻塞线程.需手动在调用WaitOne()之后调用Reset()重置信号量状态为非终止,然后再次调用WaitOne ...

  5. 211. Orchard学习 二 2、ManualResetEvent 与 AutoResetEvent

    一.Orchard里异步请求处理线程队列的控制 Orchard的Orchard.WarmupStarter模块,为HttpApplication.BeginRequest时间附加了一个异步处理事件:B ...

  6. C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用

    1.简介 虽然ThreadPool.Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常.或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它 ...

  7. C#多线程之二:ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

  8. C#多线程之 ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

  9. 对ManualResetEvent和AutoResetEvent的巩固练习

    在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度 ...

随机推荐

  1. Loadrunner请求自定义的http(json)文件and参数化

    Loadrunner请求自定义的http(json)文件and参数化      研究啦好些天这个东西啦 终于出来答案啦 嘿嘿 给大家分享一下 : 请求自定义的http文件用函数:web_custom_ ...

  2. WebScarab使用说明

    安装说明:软件是基于java开发的,所以安装前,要求你的机器已经安装了Java运行环境     软件说明:一个用来分析使用HTTP和HTTPS协议的应用程序框架,可以用来学习HTTP协议我更多的是用来 ...

  3. C# http 发送post或get请求

    /// <summary> /// 向服务器提交XML数据 /// </summary> /// <param name="url">远程访问的 ...

  4. 2016.6.17 kali Linux 隧道工具

    隧道工具的基本概念: 1.在计算机网络中,隧道工具是指使用一种网络协议去封装另一种网络协议的技术. 2.通常用来数据伪装或者穿越防火墙,在入侵目标系统后,可用来提升权限和权限维持. Kali中的隧道工 ...

  5. LilyPad Arduino可穿戴技术和电子织物控制器板简介

    LilyPad Arduino可穿戴技术和电子织物控制器板简介 第1章  LilyPad Arduino概览 作为本书的第一章,在这里将为读者介绍LilyPad Arduino相关的基础知识.例如,L ...

  6. 水题 ZOJ 3875 Lunch Time

    题目传送门 /* 水题:找排序找中间的价格,若有两个,选价格大的: 写的是有点搓:) */ #include <cstdio> #include <iostream> #inc ...

  7. BZOJ3476 : [Usaco2014 Mar]The Lazy Cow

    旋转坐标系后转化为正方形,$x'=x+y$,$y'=x-y+1000001$,$k'=2k-1$ 两根扫描线从左往右扫 f[i]表示y坐标下边界为i时的价值和 每次加入/删除一个点等价于一段区间加减 ...

  8. TYVJ P1022 进制转换 Label:坑

    背景 太原成成中学第3次模拟赛 第2道 描述 对于十进制整数N,试求其-2进制表示.例如,因为 1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13 ,所以(-13) ...

  9. myeclipse 8.5最新注册码

    myeclipse 8.5最新注册码(过期时间到2016年) Subscriber:huazai          Subscription Code:uLR8ZC-855550-6156585630 ...

  10. iOS-OC根据时间戳获取距离现在的状态(刚刚,分钟前,今天,昨天)

     iOS-OC根据时间戳获取距离现在的状态(刚刚,分钟前,今天,昨天) 获取时间戳 - (NSString *)distanceTimeWithBeforeTime:(double)beTime { ...