C# – 二十四线程 之 信号系统

ManualResetEvent

// 通知一个或多个正在等待的线程已发生事件
public sealed class ManualResetEvent : EventWaitHandle {
    // 用一个指示是否将初始状态设置为终止的布尔值初始化ManualResetEvent类的实例
    public ManualResetEvent(bool initialState);
} 

 

WaitHandle

泛泛基类,等待句柄,线程安全。

// 封装等待对共享资源的独占访问的操作系统特定的对象
public abstract class WaitHandle {
    public const int WaitTimeout = 258;
    protected WaitHandle();
    public void Dispose();
    public virtual void Close();
    // 阻止当前线程,直到当前System.Threading.WaitHandle(的实例)收到信号
    public virtual bool WaitOne();
    public virtual bool WaitAll(WaitHandle[] waitHandles, xxx);
    public virtual bool WaitAny(WaitHandle[] waitHandles, xxx); 
} 

EventWaitHandle

事件等待句柄,伊夫ntWaitHandle类表示一个线程同步事件,允许线程通过操作系统互发信号和等候相互的信号达到线程同步的目的。调用其WaitOne()方法阻塞线程运行,直到得到一个通报信号(该信号由伊芙ntWaitHandle类的Set()方法发生),然后释放线程让其不再阻塞继续运行。

// 表示一个线程同步事件
public class EventWaitHandle : WaitHandle {
    public EventWaitHandle(bool initialState, EventResetMode mode, xxx);
    public bool Reset();  // 将事件状态设置为非终止状态,导致线程阻塞
    public bool Set();    // 将事件状态设置为终止状态,允许一个或多个等待线程继续执行
    public static EventWaitHandle OpenExisting(string name, xxx);  // 打开一个现有的已命名同步事件
} 

格局分类

public enum EventResetMode{
        AutoReset = 0,  ManualReset = 1,
}

有别于:伊芙ntWaitHandle对象调用WaitOne()方法、在吸纳到通告信号后,是还是不是自动调用Reset()方法重置。

AutoRest:自动重置情势。(伊芙ntWaitHandle类的子类:System.Threading.AutoReset伊芙nt类)

当终止时,伊芙ntWaitHandle对象释放一个线程后并自动重置。假设没有等待的线程,伊夫ntWaitHandle对象将保障终止情状直到有一个线程阻止,并在释放此线程后重置。

ManualRest:手动重置方式。(伊芙ntWaitHandle类的子类:System.Threading.ManualRest伊夫nt类)

当终止时,伊芙ntWaitHandle对象释放具有等待的线程,并维持终止情状直到手动重置。

注:终止意况和非终止状态之间可以相互转换,平常发轫为非终止状态。  

方法

  • ReSet()方法:将事件情状设为非终止状态,导致线程阻塞;(设置必要等待的线程阻塞,即含有WaitOne()方法的线程阻塞)
  • Set()方法:将事件意况设为终止情状,允许一个或多个等待线程继续;(发送一个信号给操作系统,让处在等候的线程从绿灯态转换为运行态,即包罗WaitOne()方法的线程不再阻塞)
  • WaitOne()方法:阻塞当前线程,直到如今的等候句柄收到信号(使本线程处于阻塞态直到收到信号为止,即当其余非阻塞线程调用set()方法时再继续执行);

示例

public static void EventWaitHandleDemo()
{
    // 测试ManualReset模式
    EventWaitHandle ReadyEvent = new EventWaitHandle(false, EventResetMode.ManualReset, "READY");
    // 测试AutoReset模式
    //EventWaitHandle ReadyEvent = new EventWaitHandle(false, EventResetMode.AutoReset, "READY");

    // 新线程
    Thread readyThread = new Thread((it) =>
    {
        Thread.Sleep(3000);
        ReadyEvent.Set();
    });
    readyThread.Start();

    if (!ReadyEvent.WaitOne(5000)){                
        Console.WriteLine("ready failed!");
    }else{
        Console.WriteLine("ready success!");
    }

    //ReadyEvent.Reset();   // AutoReset模式会在调用WaitOne后自动调用Reset()方法

    if (!ReadyEvent.WaitOne(5000)){
        Console.WriteLine("ready failed again!");
    }else{
        Console.WriteLine("ready success again!");
    }
}  

参考:多线程编程中的伊夫ntWaitHandle示例

基础概览

三三十二线程之信号系统命名空间

using System.Threading;

线程同步类的持续层次关系图

 C# 1

C#,终止境况和非终止状态

在终止意况下,被WaitOne()阻塞的线程会逐个得到释放。倘若一个线程在伊芙ntWaitHandle对象处于终止处境时调用其WaitOne()方法,不能够起到过不去线程的意义,因为线程被其WaitOne()方法阻塞后,会应声被释放掉(实际不会堵塞)。

在非终止状态下,被WaitOne()阻塞的线程会持续被堵塞。要是一个线程在伊夫ntWaitHandle对象处于非终止状态时调用其WaitOne()方法,该线程会立时被打断。 

AutoResetEvent

// 通知正在等待的线程已发生事件
public sealed class AutoResetEvent : EventWaitHandle {
    // 用一个指示是否将初始状态设置为终止的布尔值初始化AutoResetEvent类新实例
    public AutoResetEvent(bool initialState);
}

  

 

参考:

  •  ;

 

相关文章