阅读量:0
在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
的等待并输出 “超时”。否则,输出 “任务完成”。