之前介绍了Polly,里面也有一个Timeout的策略,但是我还是按捺不住整了一个方法出来。

【名词解释】整:网上找


#region 超时策略

// 有返回值
public async Task<TResult> TimeoutAfter<TResult>(Task<TResult> task, TimeSpan timeout)
{
using (var token = new CancellationTokenSource())
{
var completedTask = await Task.WhenAny(task, Task.Delay(timeout, token.Token));
if (completedTask == task)
{
token.Cancel();
return await task;
}
else
{
throw new TimeoutException("方法执行超时");
}
}
}

// 无返回值
public async Task TimeoutAfter(Task task, TimeSpan timeout)
{
using (var token = new CancellationTokenSource())
{
var completedTask = await Task.WhenAny(task, Task.Delay(timeout, token.Token));
if (completedTask == task)
{
token.Cancel();
await task;
}
else
{
throw new TimeoutException("方法执行超时");
}
}
}
#endregion