AutoResetEvent

 private static readonly AutoResetEvent autoResetEvent = new AutoResetEvent(false);
        private static void Main()
        {
            try
            {
                Console.WriteLine("{1}线程={0}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                Thread thread = new Thread(Method)
                {
                    IsBackground = true
                };
                thread.Start();
                autoResetEvent.WaitOne();
                Console.WriteLine("Hello World");
            }
            catch (Exception ex)
            {
                while (ex != null)
                {
                    Console.WriteLine(ex.Message);
                    ex = ex.InnerException;
                }
            }
            Console.ReadLine();
        }

        private static void Method()
        {
            Thread.Sleep(2000);
            Console.WriteLine("{1}线程={0}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            autoResetEvent.Set();
        }
  private static readonly AutoResetEvent autoResetEvent = new AutoResetEvent(false);
        private static void Main()
        {
            try
            {
                Console.WriteLine("{1}线程={0}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                Thread thread = new Thread(Method)
                {
                    IsBackground = true
                };
                thread.Start();
                bool flag = autoResetEvent.WaitOne(1000);//这里只等待1秒,但是线程里的Set需要2秒之后才执行
                if (flag)
                {
                    Console.WriteLine("Hello World");
                }
                autoResetEvent.WaitOne();//这里会受到上一次的Set的影响,可以直接执行
                Console.WriteLine("Hello Chuck");
                autoResetEvent.WaitOne();
                Console.WriteLine("To be continued");
            }
            catch (Exception ex)
            {
                while (ex != null)
                {
                    Console.WriteLine(ex.Message);
                    ex = ex.InnerException;
                }
            }
            Console.ReadLine();
        }

        private static void Method()
        {
            Thread.Sleep(2000);
            Console.WriteLine("{1}线程={0}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            autoResetEvent.Set();
        }
时间: 2024-10-13 22:28:38

AutoResetEvent的相关文章

多线程之AutoResetEvent

我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作. AutoResetEvent 允许线程通过发信号互相通信.通常,此通信涉及线程需要独占访问的资源. AutoResetEvent 的方法有很多,具体方法和扩展方法请详见AutoResetEvent类,最常用方法中就有Set()和WaitOne(). 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号.如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的

AutoResetEvent和ManualResetEvent理解

AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandleAPI类似,使用中还是有区别的. 之前每次需要使用的时候,都去找他们之间的区别.虽然当时是明白了,但没有深入理解透彻,过几天又忘记了.等到下次需要使用的时候又要重新去理解这2个类. 今天再次遇到他们,写下这篇随笔..加深理解印象.到了下次再用到不用再去纠结区别了. 1.构造函数参数 var manualResetEventWaitHandle = new ManualRe

AutoResetEvent详解(线程独占访问资源)

由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后就是在方法中这样使用: instanceUnloaded.Set();//将事件状态设置为终止状态,允许一个或多个等待线程继续 instanceUnloaded.WaitOne();//对于WaitOne方法为阻止当前线程,直到收到信号! 对于这部分内容当时不是很理解,下面我们先介绍一下AutoRe

线程学习笔记(EventWaitHandler)AutoResetEvent的使用

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication46 { class TwoWaySignaling { //事件等待句柄 static EventWaitHandle _ready = new AutoRese

AutoResetEvent 类的使用说明

AutoResetEvent 类 官方描述:通知正在等待的线程已发生事件 命名空间:System.Threading 程序集:mscorlib 继承于:System.Threading.WaitHandle AutoResetEvent从字面理解就是自动重置事件,那么它具体做什么的呢?举个例子:大家都坐过动车,要上车之前大家都要经过检票口的一道自动检票门,插入一张车票门就打开,人走过去之后门就自动关闭,保证一张车票过一个人,那么AutoResetEvent的作用就是这道自动检票门! 简单了解了A

C#深入理解AutoResetEvent和ManualResetEvent

当在C#使用多线程时就免不了使用AutoResetEvent和ManualResetEvent类,可以理解这两个类可以通过设置信号来让线程停下来或让线程重新启动,其实与操作系统里的信号量很相似(汗,考完考试已经有点忘记了).下面上代码 class Program { const int count = 10; //赋值为false也就是没有信号 static AutoResetEvent myResetEvent = new AutoResetEvent(false); static int n

WaitHandle——使用AutoResetEvent

区别ManualResetEvent: 使用AutoResetEvent和使用ManualResetEvent是完全相同的,只有一点区别:在使用autoresetevent时,在调用waitOne后,会自动执行到一个reset方法. AutoResetEvent的waitone相当于将ManualResetEvent.waitone和reset合并为一个方法执行. 需要注意:autoresetevent的waitone和reset合并为了一个原子操作: 代码示例: namespace 使用Aut

C#读写者线程(用AutoResetEvent实现同步)

转载自 http://blog.csdn.net/livelylittlefish/article/details/2735440 本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! C#读写者线程(用AutoResetEvent实现同步) 1. AutoResetEvent简介 通知正在等待的线程已发生事件.无法继承此类. 常用方法简介: AutoResetEvent(bool initi

C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex System.Threading.Semaphore System.Threading.EventWaitHandle System.Threading.ManualResetEvent System.Threading.AutoResetEvent System.Object System.Thre

AutoResetEvent类的使用

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号.如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用 Set 发出资源可用的信号. 调用 Set 向 AutoResetEvent 发信号以释放等待线程.AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态.如果没有任何线程在等待,则状态将无限期地保持为终止状态. 可以通过将一个布尔值传递给构造函数来控制 AutoResetEv