ManualResetEvent
是 C# 中一种同步原语,它用于在异步编程中控制多个线程之间的执行顺序和协作。它允许一个或多个线程等待其他线程完成操作。ManualResetEvent
的主要作用是提供线程间的同步和通信机制。
在异步编程中,ManualResetEvent
的作用如下:
-
等待其他线程完成操作:当一个线程需要等待另一个线程完成特定任务时,可以使用
ManualResetEvent
的WaitOne()
方法。这将导致当前线程阻塞,直到其他线程调用ManualResetEvent
的Set()
方法来触发事件。 -
通知其他线程已完成操作:当线程完成任务后,需要通知其他等待的线程。这可以通过调用
ManualResetEvent
的Set()
方法来实现。一旦其他线程调用了WaitOne()
方法,它们将不再阻塞,并继续执行。 -
允许多个线程同时运行:
ManualResetEvent
的初始状态是未设置(signaled),这意味着当一个线程调用WaitOne()
方法时,它会立即返回,而不是阻塞。这使得多个线程可以同时运行,直到它们需要等待某个事件发生。
下面是一个简单的示例,展示了如何在异步编程中使用 ManualResetEvent
:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static ManualResetEvent _event = new ManualResetEvent(false);
static async Task Main(string[] args)
{
Task task1 = Task.Run(() => DoWork("Task 1"));
Task task2 = Task.Run(() => DoWork("Task 2"));
await Task.WhenAll(task1, task2);
Console.WriteLine("All tasks completed.");
}
static async Task DoWork(string taskName)
{
Console.WriteLine($"{taskName} started.");
// 等待手动重置事件
_event.WaitOne();
// 执行任务代码
await Task.Delay(1000);
Console.WriteLine($"{taskName} completed.");
// 设置手动重置事件,通知其他任务已完成
_event.Set();
}
}
在这个示例中,我们创建了两个异步任务 task1
和 task2
,它们都调用 DoWork
方法。DoWork
方法首先等待手动重置事件 _event
,然后执行任务代码,最后设置事件以通知其他任务已完成。通过使用 ManualResetEvent
,我们可以确保两个任务按顺序执行,即使它们是异步的。