簡體   English   中英

ASP.NET / C#事件的區別

[英]ASP.NET/C# Events difference

可能重復: .net中的ManualResetEvent和AutoResetEvent有什么區別?

ManualResetEvent和AutoResetEvent有什么區別? (示例可能會有所幫助)。

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

(程序然后只是掛起,因為有兩個線程仍在等待設置事件,並且沒有任何設置它。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM