我正在使用一个具有异步方法但没有 CancellationToken 重载的外部库。现在我正在使用另一个 StackOverflow 问题中的扩展方法来添加 CancellationTo...
方法但没有 async
的外部库 CancellationToken
。
现在我正在使用另一个 StackOverflow 问题的扩展方法来添加 CancellationToken
:
public async static Task HandleCancellation(this Task asyncTask, CancellationToken cancellationToken)
{
// Create another task that completes as soon as cancellation is requested. http://.com/a/18672893/1149773
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
cancellationToken.Register(() =>
tcs.TrySetCanceled(), useSynchronizationContext: false);
Task cancellationTask = tcs.Task;
// Create a task that completes when either the async operation completes, or
// cancellation is requested.
Task readyTask = await Task.WhenAny(asyncTask, cancellationTask);
// In case of cancellation, register a continuation to observe any unhandled exceptions
// from the asynchronous operation (once it completes). In .NET 4.0, unobserved task
// exceptions would terminate the process.
if (readyTask == cancellationTask)
asyncTask.ContinueWith(_ => asyncTask.Exception,
TaskContinuationOptions.OnlyOnFaulted |
TaskContinuationOptions.ExecuteSynchronously);
await readyTask;
}
但是底层任务仍然执行完成。这不会有什么大问题,但有时底层任务永远无法完成,并消耗了我 99% 的 CPU。
有没有什么办法可以“终止”任务而不终止进程?