mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-16 01:03:01 +08:00
59 lines
2.2 KiB
C#
59 lines
2.2 KiB
C#
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using MQTTnet.Exceptions;
|
|
|
|
namespace MQTTnet.Internal
|
|
{
|
|
public static class TaskExtensions
|
|
{
|
|
public static async Task TimeoutAfter(Func<CancellationToken, Task> action, TimeSpan timeout, CancellationToken cancellationToken)
|
|
{
|
|
if (action == null) throw new ArgumentNullException(nameof(action));
|
|
|
|
using (var timeoutCts = new CancellationTokenSource(timeout))
|
|
using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken))
|
|
{
|
|
try
|
|
{
|
|
await action(linkedCts.Token).ConfigureAwait(false);
|
|
}
|
|
catch (OperationCanceledException exception)
|
|
{
|
|
var timeoutReached = timeoutCts.IsCancellationRequested && !cancellationToken.IsCancellationRequested;
|
|
if (timeoutReached)
|
|
{
|
|
throw new MqttCommunicationTimedOutException(exception);
|
|
}
|
|
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static async Task<TResult> TimeoutAfter<TResult>(Func<CancellationToken, Task<TResult>> action, TimeSpan timeout, CancellationToken cancellationToken)
|
|
{
|
|
if (action == null) throw new ArgumentNullException(nameof(action));
|
|
|
|
using (var timeoutCts = new CancellationTokenSource(timeout))
|
|
using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken))
|
|
{
|
|
try
|
|
{
|
|
return await action(linkedCts.Token).ConfigureAwait(false);
|
|
}
|
|
catch (OperationCanceledException exception)
|
|
{
|
|
var timeoutReached = timeoutCts.IsCancellationRequested && !cancellationToken.IsCancellationRequested;
|
|
if (timeoutReached)
|
|
{
|
|
throw new MqttCommunicationTimedOutException(exception);
|
|
}
|
|
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|