如何使用CancellationToken包装单个同步操作?

时间:2016-10-07 13:49:34

标签: c# .net async-await

我有一个单一的同步操作可能需要很长时间才能完成。操作的调用者提供CancellationToken并且当取消令牌时应立即停止操作(在取消后的几毫秒内也可以在这种情况下工作)。

如何将此包装在具有CancellationToken的任务中?

我无法更改通话代码或通话本身。

过去的情况:LongOperation();

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

显然,这不起作用,因为您必须在给予Task.Run的操作中轮询令牌。

1 个答案:

答案 0 :(得分:5)

  

我无法更改呼叫代码或呼叫本身。

     

显然,这不起作用,因为您必须在给予Task.Run的操作中轮询令牌。

通过,最简单的解决方案是解除其中一个要求:允许忽略CancellationToken,或更改被叫代码。

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

执行相同操作的安全方法较少:您可以在另一个AppDomain中运行代码并在取消时关闭AppDomain,或者您可以在另一个Thread中运行代码并取消Abort Thread。但这两者都很容易导致资源泄漏或应用程序稳定性问题。唯一真正安全的方法是单独的过程。