在C#中,ManualResetEvent
类用于同步多个线程,它有两种状态:Set
和 Reset
。要实现超时机制,你可以结合使用 ManualResetEvent
和 Timer
类。下面是一个简单的示例,展示了如何使用 ManualResetEvent
实现超时机制:
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; // 设置超时时间(毫秒)
static async Task Main(string[] args)
{
_startTime = DateTime.Now;
// 启动一个任务,该任务在指定的超时时间后取消等待
var timeoutTask = Task.Delay(TimeoutMilliseconds).ContinueWith(_ => _event.Set());
// 启动另一个任务,该任务等待手动重置事件
var waitTask = Task.Run(() =>
{
Console.WriteLine("等待事件...");
_event.WaitOne();
Console.WriteLine("事件已收到,继续执行...");
});
// 等待任务完成,如果超时则取消等待
var completedTask = await Task.WhenAny(waitTask, timeoutTask);
if (completedTask == timeoutTask)
{
Console.WriteLine("超时");
}
else
{
Console.WriteLine("任务完成");
}
}
}
在这个示例中,我们创建了两个任务:timeoutTask
和 waitTask
。timeoutTask
在指定的超时时间后设置 ManualResetEvent
,而 waitTask
则等待 ManualResetEvent
被设置。我们使用 Task.WhenAny
方法等待这两个任务中的任何一个完成。如果 timeoutTask
完成(即超时),则取消 waitTask
的等待并输出 “超时”。否则,输出 “任务完成”。