45 lines
1.3 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|