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.");
}
}