CancellationHelper
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace System.ClientModel.Internal
{
[System.Runtime.CompilerServices.NullableContext(2)]
[System.Runtime.CompilerServices.Nullable(0)]
internal static class CancellationHelper
{
[System.Runtime.CompilerServices.Nullable(1)]
private static readonly string s_cancellationMessage = new OperationCanceledException().Message;
[System.Runtime.CompilerServices.NullableContext(1)]
internal static bool ShouldWrapInOperationCanceledException(Exception exception, CancellationToken cancellationToken)
{
if (!(exception is OperationCanceledException))
return cancellationToken.IsCancellationRequested;
return false;
}
[return: System.Runtime.CompilerServices.Nullable(1)]
internal static Exception CreateOperationCanceledException(Exception innerException, CancellationToken cancellationToken, string message = null)
{
return new TaskCanceledException(message ?? s_cancellationMessage, innerException);
}
private static void ThrowOperationCanceledException(Exception innerException, CancellationToken cancellationToken)
{
throw CreateOperationCanceledException(innerException, cancellationToken, null);
}
internal static void ThrowIfCancellationRequested(CancellationToken cancellationToken, Exception innerException = null)
{
if (cancellationToken.IsCancellationRequested)
ThrowOperationCanceledException(innerException, cancellationToken);
}
internal static void ThrowIfCancellationRequestedOrTimeout(CancellationToken messageToken, CancellationToken timeoutToken, Exception innerException, TimeSpan timeout)
{
ThrowIfCancellationRequested(messageToken, innerException);
if (timeoutToken.IsCancellationRequested)
throw CreateOperationCanceledException(innerException, timeoutToken, $"""{timeout:""}""");
}
}
}