1

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

当我们处理循环时,这是一个足够的解决方案。但是,如果我们正在执行需要很长时间的操作,例如从数据库中选择需要几分钟或将一个非常大的文件写入磁盘,该怎么办。我们怎样才能取消这个作业(在执行过程中),同时又允许我们优雅地退出,即释放资源、清理内存等(例如断开与数据库的连接、删除从磁盘创建的部分文件)。

4

1 回答 1

2

Stephen Toub 已经在“如何取消不可取消的异步操作?”中回答了这个问题。.

帖子的总结是,你的问题实际上是两个问题:

  1. 如何取消长操作和
  2. 你怎么能停止等待漫长的操作

在第一种情况下,如果 API 不支持,您无法取消长操作。数据库或文件 API 可能会提供其调用的异步版本,但如果 API 不允许,您无法自行取消调用。您可能必须让操作继续运行并继续执行其余代码,基本上放弃其结果。

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

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

于 2013-05-01T13:41:52.823 回答