温馨提示×

C# ManualResetEvent怎样实现超时机制

c#
小樊
81
2024-10-12 09:35:01
栏目: 编程语言

在C#中,ManualResetEvent 类用于同步多个线程,它有两种状态:SetReset。要实现超时机制,你可以结合使用 ManualResetEventTimer 类。下面是一个简单的示例,展示了如何使用 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("任务完成");
        }
    }
}

在这个示例中,我们创建了两个任务:timeoutTaskwaitTasktimeoutTask 在指定的超时时间后设置 ManualResetEvent,而 waitTask 则等待 ManualResetEvent 被设置。我们使用 Task.WhenAny 方法等待这两个任务中的任何一个完成。如果 timeoutTask 完成(即超时),则取消 waitTask 的等待并输出 “超时”。否则,输出 “任务完成”。

0