Kit.Core/LibExternal/System.Reactive/Concurrency/TaskHelpers.cs

45 lines
1.3 KiB
C#

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT License.
// See the LICENSE file in the project root for more information.
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace System.Reactive.Concurrency
{
internal static class TaskHelpers
{
private const int MaxDelay = int.MaxValue;
public static Task Delay(TimeSpan delay, CancellationToken token)
{
var milliseconds = (long)delay.TotalMilliseconds;
if (milliseconds > MaxDelay)
{
var remainder = delay - TimeSpan.FromMilliseconds(MaxDelay);
return
Task.Delay(MaxDelay, token)
.ContinueWith(_ => Delay(remainder, token), TaskContinuationOptions.ExecuteSynchronously)
.Unwrap();
}
return Task.Delay(delay, token);
}
public static Exception GetSingleException(this Task t)
{
Debug.Assert(t.IsFaulted && t.Exception != null);
if (t.Exception!.InnerException != null)
{
return t.Exception.InnerException;
}
return t.Exception;
}
}
}