zoukankan      html  css  js  c++  java
  • 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();
            }

    总结,AutoResetEvent在WaitOne之前需要先调用Reset,以防止之前某次超时之后,有其他地方调用了Set,那样会导致下一次的WaitOne可以直接进入

  • 相关阅读:
    xshell常用命令
    linux传输文件命令: rz 和 sz
    使用openssh-clients的scp命令来传输文件
    RabbitMQ初学之二:直接发送消息到队列
    [App]华为P6设置与Xamarin Studio连通测试
    [Boost]图形处理库Boost::Polygon
    [App]Taste VS2015 && Android Studio
    [Linux&Vim]输入输出流
    [SSD大法好]神舟K480-I5-D3鸟枪换炮M6S
    [IoLanguage]Io Tutorial[转]
  • 原文地址:https://www.cnblogs.com/chucklu/p/4941669.html
Copyright © 2011-2022 走看看