如何使用带有CancellationToken的Task包装单个同步操作?

Sam*_*uyn 1 .net c# async-await

我只有一个同步操作,可能需要很多时间才能完成。该操作的调用者提供了一个CancellationToken符号,并且在令牌被取消后,该操作应立即停止(在这种情况下,取消后的几毫秒内也将起作用)。

如何将其包装在带有CancellationToken的任务中?

我无法更改调用代码或调用本身。

曾经是: LongOperation();

我现在所拥有的: await Task.Run(() => LongOperation(), cancellationToken).ConfigureAwait(false);

显然,这是行不通的,因为您必须在给的操作中轮询令牌Task.Run

Ste*_*ary 5

我无法更改调用代码或调用本身。

显然,这是行不通的,因为您必须轮询赋予Task.Run的操作内的令牌。

通过最简单的解决方法是解除的条件之一:要么允许CancellationToken被忽略,或者改变被叫代码。

如果确实不能实现,那么您将需要在另一个进程中运行代码。因此,您需要启动一个可以访问该方法的子进程,将所有参数打包到该方法中,然后再封送任何结果值或异常。然后,当令牌被取消时,终止进程。

有做同样的事情的不太安全的方式:你可以在另一个运行代码AppDomain并关闭AppDomain上取消,也可以运行在其他的代码Thread,并AbortThread上取消。但是,这两种方法都容易导致资源泄漏或应用程序稳定性问题。唯一真正安全的方法是单独的过程。