使用CancellationToken实现超时控制
在C#中,可以通过CancellationTokenSource和CancellationToken实现方法超时停止。创建一个带有超时设置的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.Wait或Task.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("操作已超时");
}
注意事项
处理超时时需要考虑资源清理问题,确保方法被中断时能正确释放资源。对于无法响应取消请求的阻塞操作,可能需要使用单独的线程或进程来终止。
某些场景下可能需要结合多种技术,如先尝试优雅取消,超时后强制终止线程。强制终止线程可能带来资源泄漏风险,应谨慎使用。

924

被折叠的 条评论
为什么被折叠?



