C#实现方法超时停止

使用CancellationToken实现超时控制

在C#中,可以通过CancellationTokenSourceCancellationToken实现方法超时停止。创建一个带有超时设置的CancellationTokenSource,将token传递给需要控制的方法。

using System.Threading;
using System.Threading.Tasks;

public async Task ExecuteWithTimeoutAsync()
{
    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); // 5秒超时
    
    try
    {
        await LongRunningMethodAsync(cts.Token);
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("操作已超时取消");
    }
}

private async Task LongRunningMethodAsync(CancellationToken token)
{
    for (int i = 0; i < 10; i++)
    {
        token.ThrowIfCancellationRequested();
        await Task.Delay(1000, token); // 模拟耗时操作
        Console.WriteLine($"执行第{i+1}步");
    }
}

使用Task.Wait或Task.WhenAny实现超时

对于非异步方法或需要更灵活控制的场景,可以使用Task.WaitTask.WhenAny配合超时设置。

var task = Task.Run(() => LongRunningMethod());
if (!task.Wait(TimeSpan.FromSeconds(5)))
{
    Console.WriteLine("方法执行超时");
}

// 或者使用WhenAny
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5));
var completedTask = await Task.WhenAny(task, timeoutTask);
if (completedTask == timeoutTask)
{
    Console.WriteLine("方法执行超时");
}

使用第三方库Polly实现超时策略

Polly是一个.NET弹性和瞬态故障处理库,提供了简洁的超时策略实现方式。

using Polly;

var policy = Policy.TimeoutAsync(TimeSpan.FromSeconds(5), 
    TimeoutStrategy.Pessimistic);

try
{
    await policy.ExecuteAsync(async token => 
    {
        await LongRunningMethodAsync(token);
    }, CancellationToken.None);
}
catch (TimeoutRejectedException)
{
    Console.WriteLine("操作已超时");
}

注意事项

处理超时时需要考虑资源清理问题,确保方法被中断时能正确释放资源。对于无法响应取消请求的阻塞操作,可能需要使用单独的线程或进程来终止。

某些场景下可能需要结合多种技术,如先尝试优雅取消,超时后强制终止线程。强制终止线程可能带来资源泄漏风险,应谨慎使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值