我有一个单一的同步操作可能需要很长时间才能完成。操作的调用者提供CancellationToken
并且当取消令牌时应立即停止操作(在取消后的几毫秒内也可以在这种情况下工作)。
如何将此包装在具有CancellationToken的任务中?
我无法更改通话代码或通话本身。
过去的情况:LongOperation();
我现在拥有的内容:await Task.Run(() => LongOperation(), cancellationToken).ConfigureAwait(false);
显然,这不起作用,因为您必须在给予Task.Run
的操作中轮询令牌。
答案 0 :(得分:5)
我无法更改呼叫代码或呼叫本身。
显然,这不起作用,因为您必须在给予Task.Run的操作中轮询令牌。
通过远,最简单的解决方案是解除其中一个要求:允许忽略CancellationToken
,或更改被叫代码。
如果真的,真的,诚实地不可能,那么你需要在另一个进程中运行代码。因此,您需要启动一个可以访问该方法的子进程,将所有参数封送到它,然后封送任何结果值或异常。然后,当令牌被取消时,终止该过程。
执行相同操作的安全方法较少:您可以在另一个AppDomain
中运行代码并在取消时关闭AppDomain
,或者您可以在另一个Thread
中运行代码并取消Abort
Thread
。但这两者都很容易导致资源泄漏或应用程序稳定性问题。唯一真正安全的方法是单独的过程。