mirror of
https://github.com/netchx/netch.git
synced 2026-03-16 17:53:17 +08:00
25 lines
822 B
C#
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);
|
|
}
|
|
}
|
|
} |