【发布时间】:2016-10-07 13:49:33
【问题描述】:
我有一个可能需要很长时间才能完成的同步操作。操作的调用者提供了一个CancellationToken,并且当令牌被取消时应该立即停止操作(在这种情况下取消后的几毫秒内也可以)。
如何使用 CancellationToken 将其包装在任务中?
我无法更改调用代码或调用本身。
曾经是什么:LongOperation();
我现在拥有的:await Task.Run(() => LongOperation(), cancellationToken).ConfigureAwait(false);
显然这不起作用,因为您必须在给予Task.Run 的操作中轮询令牌。
【问题讨论】:
-
如您所见,您必须在您说无法修改的代码中执行此操作。在代码没有意识到的情况下随意中止执行很容易导致某些资源处于无效/损坏状态。见this related question。
-
你做不到。您的同步方法需要接受 CancallationToken 并且您需要定期检查是否应该中断令牌信号的执行。如果您无法更改同步方法 async/await 将无济于事。您可以创建一个新线程执行线程并按需使用 Abort。 stackoverflow.com/questions/2251964/…
标签: c# .net async-await