可能实现不太仔细,但是能用:
// netcore中
public static R CallWithTimeout<P, R>(Func<P, R> action, P p, out bool isTimeout, int millisecondsTimeout = Timeout.Infinite)
{
isTimeout = true;
if (action==null)
{
return default;
}
using CancellationTokenSource cts = new CancellationTokenSource(millisecondsTimeout);
var workTask = Task.Run(() => action(p), cts.Token);
while (true)
{
if (workTask.IsCompleted|| cts.IsCancellationRequested)
{
break;
}
Task.Delay(millisecondsTimeout / 500).Wait();
}
isTimeout = cts.IsCancellationRequested;
if (isTimeout)
{
return default;
}
return workTask.Result;
}