using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace TimeOutHelper
{
public static class TimeHelperClass
{
///
/// 异步方法超时处理
///
///
///
///
///
///
public static async Task ExecuteWithTimeoutAsync(Func> function, TimeSpan timeout)
{
using (var cts = new CancellationTokenSource())
{
var timeoutTask = Task.Delay(timeout, cts.Token);
var functionTask = function(cts.Token);
if (await Task.WhenAny(timeoutTask, functionTask) == timeoutTask)
{
cts.Cancel();
throw new TimeoutException($"操作在 {timeout.TotalSeconds} 秒后超时");
}
return await functionTask;
}
}
///
/// 同步方法超时处理
///
///
///
///
///
public static async Task ExecuteWithTimeout(Func function, TimeSpan timeout)
{
return await ExecuteWithTimeoutAsync(ct => Task.Run(() => function(), ct), timeout);
}
}
}