取消中间的任务

时间:2013-05-01 12:24:04

标签: c# task-parallel-library task

我有一个关于取消正在运行的任务的问题。我阅读了有关CancellationTokenSource的所有内容,但在使用时,您必须检查代码是否存在这样的请求。

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

1 个答案:

答案 0 :(得分:2)

Stephen Toub已经在"How do I cancel non-cancelable async operations?"回答了这个问题。

该帖子的摘要是您的问题实际上是两个问题:

  1. 如何取消长时间操作和
  2. 如何停止等待长时间操作
  3. 在第一种情况下,如果API不支持,则无法取消长操作。 DB或File API可能提供其调用的异步版本,但如果API不允许,则无法取消调用。您可能必须让操作继续运行并继续执行其余代码,实质上是丢弃其结果。

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

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