ASP.NET/C# 事件(Events)的不同之处
ASP.NET/C# 事件(Events)的不同之处
ManualResetEvent和AutoResetEvent之间有什么区别?(示例可能有帮助)。
admin 更改状态以发布 2023年5月23日
ManualResetEvent
就像草甸上的一个大门-一旦它被打开,就让人们通过,直到有人关闭它。
AutoResetEvent
就像火车站的旋转门-只要你把票放进去,一个人就可以通过,但只有一个人。
下面是一个例子-5个线程都在等待同一个事件,该事件每秒设置一次。使用手动复位事件,所有线程在事件被设置一次后“通过大门”。使用自动复位事件,只有一个人先通过。
using System; using System.Threading; class Test { static void Main() { // Change to AutoResetEvent to see different behaviour EventWaitHandle waitHandle = new ManualResetEvent(false); for (int i = 0; i < 5; i++) { int threadNumber = i; new Thread(() => WaitFor(threadNumber, waitHandle)).Start(); } // Wait for all the threads to have started Thread.Sleep(500); // Now release the handle three times, waiting a // second between each time for (int i = 0; i < 3; i++) { Console.WriteLine("Main thread setting"); waitHandle.Set(); Thread.Sleep(1000); } } static void WaitFor(int threadNumber, EventWaitHandle waitHandle) { Console.WriteLine("Thread {0} waiting", threadNumber); waitHandle.WaitOne(); Console.WriteLine("Thread {0} finished", threadNumber); } }
ManualResetEvent的
示例输出:
Thread 0 waiting Thread 4 waiting Thread 1 waiting Thread 2 waiting Thread 3 waiting Main thread setting Thread 2 finished Thread 1 finished Thread 0 finished Thread 4 finished Thread 3 finished Main thread setting Main thread setting
AutoResetEvent的
示例输出:
Thread 0 waiting Thread 1 waiting Thread 2 waiting Thread 3 waiting Thread 4 waiting Main thread setting Thread 3 finished Main thread setting Thread 2 finished Main thread setting Thread 1 finished
(然后程序就卡在那里,因为有两个线程仍在等待该事件被设置,而没有任何东西将设置它。)