我有一个关于取消正在运行的任务的问题。我阅读了关于CancellationTokenSource的全部内容,但是在使用它时,如果存在这样的请求,则必须检查代码。取消中间的任务
当我们处理循环时,这是一个适当的解决方案。 但是,我们正在执行需要很长时间的操作的场景,比如从数据库中选择需要几分钟的时间,或者向磁盘写入非常大的文件。 我们如何取消这项工作(在执行过程中),同时也允许我们正常退出,即免费资源,清理内存等。 (例如断开数据库,删除从磁盘创建的部分文件)。
我有一个关于取消正在运行的任务的问题。我阅读了关于CancellationTokenSource的全部内容,但是在使用它时,如果存在这样的请求,则必须检查代码。取消中间的任务
当我们处理循环时,这是一个适当的解决方案。 但是,我们正在执行需要很长时间的操作的场景,比如从数据库中选择需要几分钟的时间,或者向磁盘写入非常大的文件。 我们如何取消这项工作(在执行过程中),同时也允许我们正常退出,即免费资源,清理内存等。 (例如断开数据库,删除从磁盘创建的部分文件)。
Stephen Toub已经回答了在"How do I cancel non-cancelable async operations?"。
后的总结是你的问题实际上是两个问题:
在第一种情况下,如果API不支持,则无法取消长操作。数据库或文件API可能会提供其调用的异步版本,但如果API不允许它们自己,则不能取消调用。您可能不得不离开操作并继续执行其余的代码,实际上会丢弃其结果。
在第二种情况下,即使操作不使用TaskCompletionSource提供异步调用,也可以转换为Task。这将允许您的代码在取消的情况下继续并允许您清理资源。
Stephen Toub在描述问题和解决方案方面做得更好。
除了等待任务达到可以响应取消请求的程度之外,任何类型的强制取消都不会很优雅。 – hatchet 2013-05-01 12:28:06
您必须重写线程执行的代码以定期检查挂起的取消。例如,按块编写文件或执行几个较小的SELECT查询。 – JosephHirn 2013-05-01 12:31:56
我同意它不会100%优雅。正因为如此,我想要介入和释放资源的能力。你必须同意,我有上面描述的场景,因为等待它们完成就没有了。 – TaLz 2013-05-01 12:32:37