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
,我們可以確保兩個任務按順序執行,即使它們是異步的。