ManualResetEvent知识总结

ManualResetEvent是一个同步对象,用于控制线程的执行。它允许一个或多个线程被阻塞,直到ManualResetEvent对象的状态被设置。ManualResetEvent有两种状态:有信号状态和无信号状态。在没有被设置之前,ManualResetEvent对象处于无信号状态,这通常意味着所有等待该对象的线程都被阻塞。在设置之后,ManualResetEvent对象处于有信号状态,这将允许等待该对象的所有线程继续执行。

使用方法

ManualResetEvent有三个主要的成员方法:Set()、Reset()和WaitOne()。Set()方法将ManualResetEvent对象的状态设置为有信号状态,这将允许等待该对象的所有线程继续执行。Reset()方法将ManualResetEvent对象的状态设置为无信号状态,这将导致所有等待该对象的线程被阻塞。WaitOne()方法是阻塞当前线程,直到ManualResetEvent对象的状态变为有信号状态。

以下是一个简单的示例代码,展示了如何使用ManualResetEvent:

```csharp

using System;

using System.Threading;

class Program

{

static ManualResetEvent _mre = new ManualResetEvent(false);

static void Main(string[] args)

{

Console.WriteLine("Starting worker thread");

Thread workerThread = new Thread(() =>

{

Console.WriteLine("Worker thread waiting");

_mre.WaitOne();

Console.WriteLine("Worker thread running");

});

workerThread.Start();

Thread.Sleep(2000);

Console.WriteLine("Signaling worker thread to start");

_mre.Set();

workerThread.Join();

Console.WriteLine("Worker thread completed");

}

}

```

在这个示例中,主线程创建了一个ManualResetEvent对象,并将其初始状态设置为无信号状态。接着,它启动了一个工作线程,该线程将等待ManualResetEvent对象的状态变为有信号状态。主线程休眠2秒钟,然后将ManualResetEvent对象的状态设置为有信号状态,因此工作线程可以继续执行。最后,主线程等待工作线程完成,并输出一条消息。

案例说明

ManualResetEvent的一个重要用途是在生产者/消费者模式中同步线程。在这种模式中,一个线程(生产者)生成数据并将其放入共享队列中,而另一个线程(消费者)从队列中取出数据并处理它。

以下是一个示例代码,它实现了一个简单的生产者/消费者模式:

```csharp

using System;

using System.Collections.Concurrent;

using System.Threading;

class Program

{

static ConcurrentQueue _queue = new ConcurrentQueue();

static ManualResetEvent _mre = new ManualResetEvent(false);

static void Main(string[] args)

{

Thread producerThread = new Thread(() =>

{

for (int i = 0; i < 10; i++)

{

_queue.Enqueue(i);

Console.WriteLine($"Enqueued {i}");

_mre.Set();

Thread.Sleep(1000);

}

});

Thread consumerThread = new Thread(() =>

{

int value;

while (true)

{

_mre.WaitOne();

while (_queue.TryDequeue(out value))

{

Console.WriteLine($"Dequeued {value}");

}

_mre.Reset();

}

});

producerThread.Start();

consumerThread.Start();

producerThread.Join();

consumerThread.Join();

}

}

```

在这个示例中,生产者线程简单地将数字1到10添加到共享队列中,并每秒执行一次。每次添加后,它将ManualResetEvent对象的状态设置为有信号状态,以通知消费者线程有数据可处理。

消费者线程在一个无限循环中等待ManualResetEvent对象的状态变为有信号状态。一旦状态被设置,它就排空共享队列,并处理所有收到的数据。在完成处理后,它将ManualResetEvent对象的状态设置为无信号状态,以通知生产者线程可以继续添加数据。

这个示例展示了如何使用ManualResetEvent实现生产者/消费者模式,并确保线程之间的同步。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(84) 打赏

评论列表 共有 1 条评论

柠檬加醋好心酸 2年前 回复TA

年元旦不送礼,发条短信送给自己。健康快乐长伴自己,好运和自己不分离。还有让我告诉自己,财神已经跟随自己。

立即
投稿
发表
评论
返回
顶部