在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
摘要AutoResetEvent:msdn的描述是通知正在等待的线程已发生事件。此类不能被继承。也就是说它有那么一个时间点,会通知正在等待的线程可以做其它的事情了。 AutoResetEvent该类有一个带bool类型参数的构造函数 #region Assembly mscorlib.dll, v4.0.0.0 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll #endregion using System; using System.Runtime.InteropServices; namespace System.Threading { // Summary: // Notifies a waiting thread that an event has occurred. This class cannot be // inherited. [ComVisible(true)] public sealed class AutoResetEvent : EventWaitHandle { // Summary: // Initializes a new instance of the System.Threading.AutoResetEvent class with // a Boolean value indicating whether to set the initial state to signaled. // // Parameters: // initialState: // true to set the initial state to signaled; false to set the initial state // to non-signaled. public AutoResetEvent(bool initialState); } } 该bool值指示初始化的时候是否设置为终止状态。 Typically, you use this class when threads need exclusive access to a resource. AutoResetEvent允许线程之间通过信号进行通信。通常,当线程独占访问资源的时候你可以使用该类。
一个线程等待在AutoResetEvent上调用WaitOne信号。如果AutoResetEvent为未触发状态,则线程会被阻止,并等待当前控制资源的线程通过调用Set来通知资源可用。 调用Set信号,AutoResetEvent将释放一个等待中的线程。当AutoResetEvent被设置为已触发状态时,它将一直保持已触发状态直到一个等待的线程被激活,然后它将自动编程未触发状态。如果没有任何线程在等待,则状态将无限期地保持为已触发状态。 如果当AutoResetEvent为已触发状态时调用WaitOne,则线程不会被阻止。AutoResetEvent将立即释放线程并返回到未触发状态。
你可以通过构造函数的bool值参数控制初始化时AutoRestEvent的状态。若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false。 示例 下面的示例将演示如何使用AutoResetEvent通过Set方法在用户按下回车键的时候释放一个线程。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Wolfy.AutoResetEventDemo { class Program { const int numIterations = 100; //初始化为非终止状态。 static AutoResetEvent myResetEvent = new AutoResetEvent(false); static int number; static void Main(string[] args) { //创建并启动读线程 Thread myReaderThread = new Thread(new ThreadStart(MyReaderThreadProc)); myReaderThread.Name = "ReaderThread"; myReaderThread.Start(); for (int i = 0; i < numIterations; i++) { Console.WriteLine("Writer thread writing value:{0}", i); number = i; //给读线程信号 myResetEvent.Set(); Thread.Sleep(1); } myReaderThread.Abort(); } private static void MyReaderThreadProc() { while (true) { myResetEvent.WaitOne(); Console.WriteLine("{0} reading value:{1}", Thread.CurrentThread.Name, number); } } } } 执行顺序 运行结果
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论