ASP.NET/C# 事件(Events)的不同之处

21 浏览
0 Comments

ASP.NET/C# 事件(Events)的不同之处

可能是重复的问题:什么是.NET中ManualResetEvent和AutoResetEvent的区别?

ManualResetEvent和AutoResetEvent之间有什么区别?(示例可能有帮助)。

admin 更改状态以发布 2023年5月23日
0
0 Comments

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

(然后程序就卡在那里,因为有两个线程仍在等待该事件被设置,而没有任何东西将设置它。)

0