C# 自动复位事件和手动复位事件 使用系统; 使用系统线程; 公开课范例 { //mre用于手动阻止和释放线程 //在未标记状态下创建。 专用静态手动复位事件mre=新手动复位事件(假); 静态void Main() { Console.WriteLine(“\n开始3个阻止ManualResetEvent的命名线程:\n”); 对于(int i=0;i

C# 自动复位事件和手动复位事件 使用系统; 使用系统线程; 公开课范例 { //mre用于手动阻止和释放线程 //在未标记状态下创建。 专用静态手动复位事件mre=新手动复位事件(假); 静态void Main() { Console.WriteLine(“\n开始3个阻止ManualResetEvent的命名线程:\n”); 对于(int i=0;i,c#,C#,有一些地方使用这种东西。就我个人而言,我通常更喜欢Monitor.Wait/Pulse,但有时{Manual/Auto}ResetEvent更有用-尤其是在您希望能够等待多个句柄的地方 我见过的两个最明显的例子是: 生产者/消费者队列:当队列为空时,消费者将在监视器或等待句柄上等待。然后,生产者将在添加项目时脉冲/设置监视器/句柄,以唤醒消费者,使其知道有工作要做 唤醒一个“休眠”线程,让它知道它可以退出:在(!ShouldStop){Work();Wait(10000);}类循环中有一个,这

有一些地方使用这种东西。就我个人而言,我通常更喜欢
Monitor.Wait
/
Pulse
,但有时{Manual/Auto}ResetEvent更有用-尤其是在您希望能够等待多个句柄的地方

我见过的两个最明显的例子是:

  • 生产者/消费者队列:当队列为空时,消费者将在监视器或等待句柄上等待。然后,生产者将在添加项目时脉冲/设置监视器/句柄,以唤醒消费者,使其知道有工作要做
  • 唤醒一个“休眠”线程,让它知道它可以退出:在(!ShouldStop){Work();Wait(10000);}类循环中有一个
    ,这是很正常的;“stopping”线程可以再次让等待的线程唤醒,通知它“stop”标志已经设置
当然,这些场景非常相似,毫无疑问还有更多——但这些是我最常看到的场景

using System;
using System.Threading;

public class Example
{
    // mre is used to block and release threads manually. It is
    // created in the unsignaled state.
    private static ManualResetEvent mre = new ManualResetEvent(false);

    static void Main()
    {
        Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n");

        for(int i = 0; i <= 2; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" +
                          "\nto release all the threads.\n");
        Console.ReadLine();

        mre.Set();

        Thread.Sleep(500);
        Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" +
                          "\ndo not block. Press Enter to show this.\n");
        Console.ReadLine();

        for(int i = 3; i <= 4; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" +
                          "\nwhen they call WaitOne().\n");
        Console.ReadLine();

        mre.Reset();

        // Start a thread that waits on the ManualResetEvent.
        Thread t5 = new Thread(ThreadProc);
        t5.Name = "Thread_5";
        t5.Start();

        Thread.Sleep(500);
        Console.WriteLine("\nPress Enter to call Set() and conclude the demo.");
        Console.ReadLine();

        mre.Set();

        // If you run this example in Visual Studio, uncomment the following line:
        //Console.ReadLine();
    }

    //thread entry point
    private static void ThreadProc()
    {
        string name = Thread.CurrentThread.Name;

        Console.WriteLine(name + " starts and calls mre.WaitOne()");
        //wait untill signaled   
        mre.WaitOne();

        Console.WriteLine(name + " ends.");
    }
}