在C#中,ManualResetEvent
類用于同步多個線程,它有兩種狀態(tài):Set
和 Reset
。要實(shí)現(xiàn)超時機(jī)制,你可以結(jié)合使用 ManualResetEvent
和 Timer
類。下面是一個簡單的示例,展示了如何使用 ManualResetEvent
實(shí)現(xiàn)超時機(jī)制:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static ManualResetEvent _event = new ManualResetEvent(false);
static DateTime _startTime;
static const int TimeoutMilliseconds = 5000; // 設(shè)置超時時間(毫秒)
static async Task Main(string[] args)
{
_startTime = DateTime.Now;
// 啟動一個任務(wù),該任務(wù)在指定的超時時間后取消等待
var timeoutTask = Task.Delay(TimeoutMilliseconds).ContinueWith(_ => _event.Set());
// 啟動另一個任務(wù),該任務(wù)等待手動重置事件
var waitTask = Task.Run(() =>
{
Console.WriteLine("等待事件...");
_event.WaitOne();
Console.WriteLine("事件已收到,繼續(xù)執(zhí)行...");
});
// 等待任務(wù)完成,如果超時則取消等待
var completedTask = await Task.WhenAny(waitTask, timeoutTask);
if (completedTask == timeoutTask)
{
Console.WriteLine("超時");
}
else
{
Console.WriteLine("任務(wù)完成");
}
}
}
在這個示例中,我們創(chuàng)建了兩個任務(wù):timeoutTask
和 waitTask
。timeoutTask
在指定的超時時間后設(shè)置 ManualResetEvent
,而 waitTask
則等待 ManualResetEvent
被設(shè)置。我們使用 Task.WhenAny
方法等待這兩個任務(wù)中的任何一個完成。如果 timeoutTask
完成(即超時),則取消 waitTask
的等待并輸出 “超時”。否則,輸出 “任務(wù)完成”。