C#线程同步手动重置事件——ManualResetEvent

和AutoResetEvent类的区别是,Manual一旦set后不会自动reset,会放行所有waitone的线程,而autoresetevent每一次set之后只会放行一个waitone的线程,然后立即自动reset。这就是自动和手动的区别,实际上说的是自动reset和手动reset。

这里就贴一段翻译注释的msdn官方代码吧。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace myTest
{
    class Program
    {
        private static ManualResetEvent mre = new ManualResetEvent(false);
        static void Main(string[] args)
        {
            Console.WriteLine("\n开启3个被ManualResetEvent阻塞的线程,并分别命名:\n");

            for (int i = 0; i <= 2; i++)
            {
                Thread t = new Thread(ThreadProc);
                t.Name = "Thread_" + i;
                t.Start();
            }

            Thread.Sleep(500);
            Console.WriteLine("\n当所有的线程都start后,按下回车键以运行ManualResetEvent的set方法" +
                              "\n来释放所有线程的阻塞状态.\n");
            Console.ReadLine();

            mre.Set();

            Thread.Sleep(500);
            Console.WriteLine("\n一旦ManualResetEvent对象收到了set的信号,后面再调用WaitOne()方法的线程" +
                              "\n就不会被阻塞了.按下回车键查看结果.\n");
            Console.ReadLine();

            for (int i = 3; i <= 4; i++)
            {
                Thread t = new Thread(ThreadProc);
                t.Name = "Thread_" + i;
                t.Start();
            }

            Thread.Sleep(500);
            Console.WriteLine("\n按下回车键调用 Reset(), 这样后边再启动的线程调用waitone()时又会被阻塞了" );
            Console.ReadLine();

            mre.Reset();

            // 启动一个被ManualResetEvent阻塞的线程
            Thread t5 = new Thread(ThreadProc);
            t5.Name = "Thread_5";
            t5.Start();

            Thread.Sleep(500);
            Console.WriteLine("\n按下Enter键调用 Set() 并结束此次演示.");
            Console.ReadLine();

            mre.Set();
Console.ReadLine();

        }
        private static void ThreadProc()
        {
            string name = Thread.CurrentThread.Name;

            Console.WriteLine(name + " 启动并调用 mre.WaitOne()");

            mre.WaitOne();

            Console.WriteLine(name + " 退出.");
        }
    }
}
时间: 2024-12-13 06:05:47

C#线程同步手动重置事件——ManualResetEvent的相关文章

C# 并行编程 之 轻量级手动重置事件的使用

目录(?)[-] 简单介绍 使用超时和取消 跨进程或AppDomain的同步 简单介绍 如果预计操作的等待的时间非常短,可以考虑使用轻量级的手动重置事件,ManualResetEventSlim.它可以发出信号和等待事件.从名称和使用方式上看,它主要是提供以人为本的操作方式,在基于人对程序运行过程非常了解的情况下,由人控制整个同步的过程. ManualResetEventSlim 提供了3个常用的方法和3个只读的属性. 构造函数: ManualResetEventSlim():使用无信号初始状态

进程、线程同步互斥学习 —— 事件

关于事件,先看MSDN介绍: Event Objects Anevent object is a synchronization object whose state can be explicitly set to signaled by use of theSetEvent function. 即:Event与其他线程同步不同,Event可以通过函数来设置有无信号量. 初始化 A thread uses theCreateEvent or CreateEventEx function to

CLR 线程同步

CLR 基元线程同步构造 <CLR via C#>到了最后一部分,这一章重点在于线程同步,多个线程同时访问共享数据时,线程同步能防止数据虽坏.之所以要强调同时,是因为线程同步问题其实就是计时问题.为构建可伸缩的.响应灵敏的应用程序,关键在于不要阻塞你拥有的线程,使它们能用于(和重用于)执行其他任务. 不需要线程同步是最理想的情况,因为线程同步存在许多问题: 1 第一个问题是,它比较繁琐,很容易出错. 2 第二个问题是,它们会损坏性能.获取和释放锁是需要时间的,因为要调用一些额外的方法,而且不同

线程同步 –AutoResetEvent和ManualResetEvent

上一篇介绍了通过lock关键字和Monitor类型进行线程同步,本篇中就介绍一下通过同步句柄进行线程同步. 在Windows系统中,可以使用内核对象进行线程同步,内核对象由系统创建并维护.内核对象为内核所拥有,所以不同进程可以访问同一个内核对象, 如进程.线程.事件.信号量.互斥量等都是内核对象.其中,信号量,互斥体,事件是Windows专门用来进行线程同步的内核对象. 在.NET中,有一个WaitHandle抽象类,这个类型封装了一个Windows内核对象句柄,在C#代码中,我们就可以使用Wa

C# 使用ManualResetEvent 进行线程同步

上一篇我们介绍了AutoResetEvent,这一篇我们来看下ManualResetEvent ,顾名思义ManualResetEvent  为手动重置事件. AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别. Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法,则

临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) (转)临界区,互斥量,信号量,事件的区别(线程同步) . 分类: C++ windows 核心编程 2012-04-10 14:55 3321人阅读 评论(0) 收藏 举报 semaphoremfcnulleventsthreadhttp服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个

VC++线程同步(四) 事件使用例子

事件(Event)同步对象 (内核级别)事件内核对象包含: 1 一个使用计数器 2 一个表示事件是否是自动重置还是手动重置的布尔值 3 一个表示事件有没有被触发的布尔值 4 当触发为true时,等待该事件的线程变为可调度状态 5 事件的触发表示一个操作已经完成 作用: 通知其他线程,我已经完成读写操作了,轮到你们来做了. 他分为两种类型: 1是手动重置事件,也就是要进行手动的触发和非触发状态的切换. 2是自动重置事件,这种情况下只需要设置触发事件,不用管什么时候切换触发状态. 尽量使用手动重置方

(转)临界区,互斥量,信号量,事件的区别(线程同步)

(转)临界区,互斥量,信号量,事件的区别(线程同步) 分类: C++ windows 核心编程 2012-04-10 14:55 2064人阅读 评论(0) 收藏 举报 semaphore mfc null events thread http服务器 四种进程或线程同步互斥的控制方法 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个具有有限数量用户资源而设计. 4.事 件:用来通

Visual C++线程同步技术剖析:临界区,事件,信号量,互斥量

转自: 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其处理任务完成后进行. 如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解.例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题.如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数