AutoResetEvent.WaitOne()

 

先前執行緒文章以有用到AutoResetEvent 類別裡的WaitOne方法,

但總覺得WaitOne方法似乎不是很好懂,故還是來了解一下其用法好了。

WaitOne方法主要有三種形式分別是,WaitOne()、WaitOne(Int32)、WaitOne(Int32,Boolean),

WaitOne()之前已經用過了,所以來看WaitOne(Int32)如何使用

 

一、WaitOne(Int32)

using System;
using System.Threading;

namespace WaitOne
{
    class Program
    {
        static AutoResetEvent autoEvent = new AutoResetEvent(false);
        static void Main(string[] args)
        {

            Console.WriteLine("Main starting.");

            ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod), autoEvent);

            // Wait for work method to signal.
            if (autoEvent.WaitOne(1000))
            {
                Console.WriteLine("Work method signaled.");
            }
            else
            {
                Console.WriteLine("Timed out waiting for work " + "method to signal.");
            }
            Console.WriteLine("Main ending.");
            Console.ReadKey();
        }

        static void WorkMethod(object stateInfo)
        {
            Console.WriteLine("Work starting.");

            // Simulate time spent working.
            Thread.Sleep(new Random().Next(100, 2000));

            // Signal that work is finished.
            Console.WriteLine("Work ending.");
            ((AutoResetEvent)stateInfo).Set();
        }
    }
}

執行結果

 

以上程式碼動作為,WaitOne(1000)代表只封鎖目前執行緒一秒鐘,

並指定下一層執行緒為目前執行個體,並讓目前執行個體只執行一秒鐘 ,

如果目前執行緒個體在一秒鐘之內還沒執行完工作時則會切回上一層執行緒,

而如果執行完工作時則理所當然切回上一層執行緒,

另外如果目前執行緒個體在一秒鐘之內有收到訊號(使用Set()方法)則回傳為true,否則為false。

 

二、WaitOne(Int32,Boolean)

由於WaitOne(Int32,Boolean)個人還不會使用,

有請網路上的高手教學囉。

 

參考資料:

WaitHandle 類別

WaitHandle.WaitOne 方法 (Int32)

WaitHandle.WaitOne 方法 (Int32, Boolean)