ManulResetEvent与AutoResetEvent

定义

ManualResetEvent:通知正在等待的线程已发生事件。

AutoResetEvent:通知正在等待的线程已发生事件。

代码

ManualResetEvent测试

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

namespace NetThreading.UserThread

{

/// <summary>

/// ManualAutoResetEvent的用法

/// </summary>

public class ManualResetEventApp:IMain

{

#region IMain 成员

public void MainRun()

{

Console.WriteLine("ManualResetEvent ---------------------------------");

//指定ManualResetEvent的初始状态为无信号状态,ManualResetEvent等待5秒后超时,

//ManualResetEvent的状态仍是无信号状态

Console.WriteLine("ManualResetEvent default state:fase ");

ManualResetEvent manualResetEvent = new ManualResetEvent(false);

//ManualResetEvent 初始值为false,ManualResetEvent一直等待有信号,等待超时时间为5s

Console.WriteLine("ManualResetEvent 初始值为false,ManualResetEvent一直等待有信号,等待超时时间为5s");

bool currentResult=manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));

Console.WriteLine(string.Format("ManualResetEvent:After wait State:{0}",currentResult));

//指定ManualResetEvent的初始状态为有信号状态,ManualResetEvent等待5秒后超时,

//ManualResetEvent的状态仍是有信号状态

Console.WriteLine("ManualResetEvent default state:true ");

manualResetEvent = new ManualResetEvent(true );

//ManualResetEvent 初始值为true,ManualResetEvent不用等待,超时时间不起作用

Console.WriteLine("ManualResetEvent 初始值为true,ManualResetEvent不用等待,超时时间不起作用");

currentResult = manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));

Console.WriteLine(string.Format("ManualResetEvent:After wait State:{0}", currentResult));

//改变信号状态

Console.WriteLine("改变信号状态");

Console.WriteLine("ManualResetEvent default state:fale ");

manualResetEvent = new ManualResetEvent(false );

Console.WriteLine("will set");

manualResetEvent.Set();

Console.WriteLine("ManualResetEvent 设置为有信号,状态改变,ManualResetEvent不会等待");

Console.WriteLine("after set ");

currentResult = manualResetEvent.WaitOne(TimeSpan.FromSeconds(10));

Console.WriteLine(string.Format("ManualResetEvent:After wait State:{0}", currentResult));

Console.WriteLine("AutoResetEvent 再次等待(超时时间10s)");

currentResult = manualResetEvent.WaitOne(TimeSpan.FromSeconds(10));

Console.WriteLine(string.Format("manualResetEvent:After wait State:{0}", currentResult));

}

#endregion

}

}

AutoResetEvent测试

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

namespace NetThreading.UserThread

{

/// <summary>

/// AutoResetEventApp的用法

/// </summary>

public class AutoResetEventApp:IMain

{

#region IMain 成员

public void MainRun()

{

Console.WriteLine("AutoResetEvent ---------------------------------");

//指定AutoResetEvent的初始状态为无信号状态,AutoResetEvent等待5秒后超时,

//AutoResetEvent的状态仍是无信号状态

Console.WriteLine("AutoResetEvent default state:fase ");

AutoResetEvent autoResetEvent = new AutoResetEvent(false);

//AutoResetEvent 初始值为false,AutoResetEvent一直等待有信号,等待超时时间为5s

Console.WriteLine("AutoResetEvent 初始值为false,AutoResetEvent一直等待有信号,等待超时时间为5s");

bool currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(5));

Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

//指定AutoResetEvent的初始状态为有信号状态,AutoResetEvent等待5秒后超时,

//AutoResetEvent的状态仍是有信号状态

Console.WriteLine("AutoResetEvent default state:true ");

autoResetEvent = new AutoResetEvent(true);

//AutoResetEvent 初始值为true,AutoResetEvent不用等待,超时时间不起作用

Console.WriteLine("AutoResetEvent 初始值为true,AutoResetEvent不用等待,超时时间不起作用");

currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(5));

Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

//改变信号状态

Console.WriteLine("改变信号状态");

Console.WriteLine("AutoResetEvent default state:fale ");

autoResetEvent = new AutoResetEvent(false);

Console.WriteLine("will set");

autoResetEvent.Set();

Console.WriteLine("AutoResetEvent 设置为有信号,状态改变,AutoResetEvent不会等待");

Console.WriteLine("after set ");

currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(10));

Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

Console.WriteLine("AutoResetEvent 再次等待(超时时间10s)");

currentResult = autoResetEvent.WaitOne(TimeSpan.FromSeconds(10));

Console.WriteLine(string.Format("AutoResetEvent:After wait State:{0}", currentResult));

}

#endregion

}

}

运行结果

clip_image002

结论

共同点:

ManualResetEvent与AutoResetEvent都是在没有信号的情况下等待。一旦有信号,两者都是立即执行,不等待。

不同点:

ManualResetEvent:信号发生改变之后在下一次等待中信号状态不会发生变化,而AutoResetEvent在信号发生之后再次等待,它的信号状态又被自动重置为无信号。

原文地址:https://www.cnblogs.com/hbb0b0/p/1934430.html