C# EventWaitHandle類解析


  EventWaitHandle 類用於在異步操作時控制線程間的同步,即控制一個或多個線程繼行或者等待其他線程完成。

  構造函數

EventWaitHandle(bool initialState, EventResetMode mode);

  initialState設置初始狀態,如果為true,則WaitOne()在調用Reset()方法前不會阻塞線程,先調用Reset()再調用WaitOne()會阻塞WaitOne()所在線程;如果設置為false,則WaitOne()會阻塞,直到調用Set()

  mode設置為EventResetMode.ManualReset,在調用Set()時所有WaitOne()阻塞線程都會繼續執行;設置為EventResetMode.AutoReset則每次調用Set()會使一個WaitOne()阻塞的線程繼續執行,一般按照阻塞先后順序執行

  上一個例子

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        private int n1, n2, n3;
        //將信號狀態設置為非終止
        EventWaitHandle myEventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
        static void Main(string[] args)
        {
            Program p = new Program();
            Thread t0 = new Thread(new ThreadStart(p.WriteThread));
            Thread t1 = new Thread(new ThreadStart(p.ReadThread1));
            Thread t2 = new Thread(new ThreadStart(p.ReadThread2));
            t0.Start();
            t1.Start();
            t2.Start();
            Console.ReadLine();
        }

        private void WriteThread()
        {
            //允許其他需要等待的線程阻塞
            myEventWaitHandle.Reset();
            Console.WriteLine("t1");
            n1 = 1;
            n2 = 2;
            n3 = 3;
            //允許其他等待線程繼續
            myEventWaitHandle.Set();
        }

        private void ReadThread1()
        {
            //堵塞當前線程,知道收到信號
            myEventWaitHandle.WaitOne();
            Console.WriteLine("{0}+{1}+{2}={3}", n1, n2, n3, n1 + n2 + n3);
        }

        private void ReadThread2()
        {
            //堵塞當前線程,知道收到信號
            myEventWaitHandle.WaitOne();
            Console.WriteLine("{0}+{1}+{2}={3}", n3, n2, n1, 2*(n1 + n2 + n3));
        }
    }
}

  執行結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM