溫馨提示×

C# ManualResetEvent怎樣實(shí)現(xiàn)超時機(jī)制

c#
小樊
83
2024-10-12 09:35:01
欄目: 編程語言

在C#中,ManualResetEvent 類用于同步多個線程,它有兩種狀態(tài):SetReset。要實(shí)現(xiàn)超時機(jī)制,你可以結(jié)合使用 ManualResetEventTimer 類。下面是一個簡單的示例,展示了如何使用 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ù):timeoutTaskwaitTask。timeoutTask 在指定的超時時間后設(shè)置 ManualResetEvent,而 waitTask 則等待 ManualResetEvent 被設(shè)置。我們使用 Task.WhenAny 方法等待這兩個任務(wù)中的任何一個完成。如果 timeoutTask 完成(即超時),則取消 waitTask 的等待并輸出 “超時”。否則,輸出 “任務(wù)完成”。

0