Files
netch/Netch/3rd/DnsClient.NET/TaskExtensions.cs
Connection Refused b2ea730984 done
2019-12-02 19:51:12 +08:00

25 lines
822 B
C#

namespace System.Threading.Tasks
{
internal static class TaskExtensions
{
public static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken, Action onCancel)
{
var tcs = new TaskCompletionSource<bool>();
using (cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs))
{
if (task != await Task.WhenAny(task, tcs.Task).ConfigureAwait(false))
{
try
{
onCancel();
}
catch { }
throw new OperationCanceledException(cancellationToken);
}
}
return await task.ConfigureAwait(false);
}
}
}