关闭

ManualResetEvent和AutoResetEvent——多线程

标签: C#多线程
143人阅读 评论(0) 收藏 举报
分类:

初次体验

ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步;以下一段是引述网上和MSDN的解析:

在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别。Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送。可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态。如果某个线程调用WaitOne方法,则当信号处于发送状态时,该线程会得到信号, 继续向下执行。其区别就在调用后,AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,AutoResetEvent一次只唤醒一个线程;而ManualResetEvent则可以唤醒多个线程,因为当某个线程调用了ManualResetEvent.Set()方法后,其他调用WaitOne的线程获得信号得以继续执行,而ManualResetEvent不会自动将信号置为不发送。也就是说,除非手工调用了ManualResetEvent.Reset()方法,则ManualResetEvent将一直保持有信号状态,ManualResetEvent也就可以同时唤醒多个线程继续执行。

本质上AutoResetEvent.Set()方法相当于ManualResetEvent.Set()+ManualResetEvent.Reset();

因此AutoResetEvent一次只能唤醒一个线程,其他线程还是堵塞

生动示例

用一个三国演义的典故来写段示例代码:

话说曹操率领80W大军准备围剿刘备和孙权,面对敌众我寡的情况,诸葛亮与周瑜想到了一个妙计,用装满火药桶的大船去冲击曹操连在一起的战船,计划都安排好了,可谓“万事俱备 只欠东风”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace Test
{
    class Program
    {
        //默认信号为不发送状态
        private static ManualResetEvent mre = new ManualResetEvent(false);
 
        static void Main(string[] args)
        {
            EastWind wind = new EastWind(mre);
            //启动东风的线程
            Thread thd = new Thread(new ThreadStart(wind.WindComming));
            thd.Start();
 
            mre.WaitOne();//万事俱备只欠东风,事情卡在这里了,在东风来之前,诸葛亮没有进攻
 
            //东风到了,可以进攻了
            Console.WriteLine("诸葛亮大吼:东风来了,可以进攻了,满载燃料的大船接着东风冲向曹操的战船");
            Console.ReadLine();
        }
    }
 
    /// <summary>
    /// 传说中的东风
    /// </summary>
    class EastWind
    {
        ManualResetEvent _mre;
 
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="mre"></param>
        public EastWind(ManualResetEvent mre)
        {
            _mre = mre;
        }
 
        /// <summary>
        /// 风正在吹过来
        /// </summary>
        public void WindComming()
        {
            Console.WriteLine("东风正在吹过来");
            for (int i = 0; i <= 5; i++)
            {
                Thread.Sleep(500);
                Console.WriteLine("东风吹啊吹,越来越近了...");
            }
            Console.WriteLine("东风终于到了");
 
            //通知诸葛亮东风已到,可以进攻了,通知阻塞的线程可以继续执行了
            _mre.Set();
        }
    }
 
}

运行结果:

1


转载自:http://www.cnblogs.com/charley_yang/archive/2010/10/31/1865663.html

0
0
查看评论

AutoResetEvent 与 ManualResetEvent区别

在C#多线程编程中,这两个类几乎是不可或缺的,他们的用法/声明都很类似,那么区别在哪里了?Set方法将信号置为发送状态 Reset方法将信号置为不发送状态 WaitOne等待信号的发送其实,从名字就可以看出一点端倪  ,一个手动,一个自动,这个手动和自动实际指的是在Reset方法的处理上,...
  • tijichen
  • tijichen
  • 2005-03-02 11:15
  • 10395

c#中利用 AutoResetEvent和ManualResetEvent实现线程同步

概念:    线程的本质   线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。     线程,有时被称为轻量级进程(Lightweight ...
  • qq_14844633
  • qq_14844633
  • 2016-08-23 10:58
  • 295

AutoResetEvent和ManualRestEvent

public partial class Form1 : Form     {         public Form1()       &...
  • xgugu1210
  • xgugu1210
  • 2015-11-22 15:24
  • 317

C# 多线程 AutoResetEvent和ManualResetEvent

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; ...
  • foreverhot1019
  • foreverhot1019
  • 2017-04-20 17:19
  • 567

C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent

最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading.WaitHandle.WaitOne 、System....
  • wangyinlon
  • wangyinlon
  • 2017-01-26 10:14
  • 369

多线程ManualResetEvent和AutoResetEvent

初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步;以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别。Set方法将信...
  • weixin_39029925
  • weixin_39029925
  • 2017-07-25 10:12
  • 74

c# ManualResetEvent 解决socket连接超时问题

最近在做一个端口高速扫描器,在参考http://blog.csdn.net/hany3000/article/details/42422667 的博文时,发现一些问题,可能对读者造成误解,下面将对这个问题重新讲解 class Scanner     {   ...
  • nightwizard2030
  • nightwizard2030
  • 2016-11-13 10:13
  • 1206

线程 ManualResetEvent 类

 Reset(): 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时, 它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。为了把状态修改为无信号的,必须调用ReSet()方法。WaitO...
  • ssrs626
  • ssrs626
  • 2008-05-27 17:57
  • 2231

ManualResetEvent和AutoResetEvent 区别

ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步;以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别。Set方法将信号置为发送状...
  • foreverhot1019
  • foreverhot1019
  • 2017-03-07 10:54
  • 128

AutoResetEvent和ManualResetEvent用法

概述:AutoResetEvent和ManualResetEvent从字面意思来讲第一个表示的是自动重置,第二个表示手动重置,它们两都有三个方法Reset(),Set(),WaitOne()。在创建对象的时候有一个bool参数,true表示创建有信号的对象,false表示创建无信号的对象。下面来看一...
  • shellwin
  • shellwin
  • 2010-08-26 14:00
  • 1042
    个人资料
    • 访问:1524次
    • 积分:60
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类