2013-05-01 81 views
1

我有一个关于取消正在运行的任务的问题。我阅读了关于CancellationTokenSource的全部内容,但是在使用它时,如果存在这样的请求,则必须检查代码。取消中间的任务

当我们处理循环时,这是一个适当的解决方案。 但是,我们正在执行需要很长时间的操作的场景,比如从数据库中选择需要几分钟的时间,或者向磁盘写入非常大的文件。 我们如何取消这项工作(在执行过程中),同时也允许我们正常退出,即免费资源,清理内存等。 (例如断开数据库,删除从磁盘创建的部分文件)。

+0

除了等待任务达到可以响应取消请求的程度之外,任何类型的强制取消都不会很优雅。 – hatchet 2013-05-01 12:28:06

+0

您必须重写线程执行的代码以定期检查挂起的取消。例如,按块编写文件或执行几个较小的SELECT查询。 – JosephHirn 2013-05-01 12:31:56

+0

我同意它不会100%优雅。正因为如此,我想要介入和释放资源的能力。你必须同意,我有上面描述的场景,因为等待它们完成就没有了。 – TaLz 2013-05-01 12:32:37

回答

2

Stephen Toub已经回答了在"How do I cancel non-cancelable async operations?"

后的总结是你的问题实际上是两个问题:

  1. 你怎么能取消长时间操作和
  2. 你怎么能阻止等待长时间操作

在第一种情况下,如果API不支持,则无法取消长操作。数据库或文件API可能会提供其调用的异步版本,但如果API不允许它们自己,则不能取消调用。您可能不得不离开操作并继续执行其余的代码,实际上会丢弃其结果。

在第二种情况下,即使操作不使用TaskCompletionSource提供异步调用,也可以转换为Task。这将允许您的代码在取消的情况下继续并允许您清理资源。

Stephen Toub在描述问题和解决方案方面做得更好。