C# 在中间取消任务

C# 在中间取消任务,c#,task-parallel-library,task,C#,Task Parallel Library,Task,我有一个关于取消正在运行的任务的问题。我阅读了有关的所有内容,但在使用它时,如果存在这样的请求,则必须签入代码 当我们处理循环时,这是一个适当的解决方案。 但是,如果我们执行的操作需要很长时间,例如从数据库中进行选择需要几分钟,或者将非常大的文件写入磁盘,那么情况又如何呢。 我们如何取消此作业(在执行过程中),同时允许我们优雅地退出,即释放资源、清理内存等。 (例如,断开与数据库的连接,删除从磁盘创建的部分文件)。Stephen Toub已经在中回答了这个问题 这篇文章的摘要是,你的问题实际上是

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

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

Stephen Toub已经在中回答了这个问题

这篇文章的摘要是,你的问题实际上是两个问题:

  • 你怎么能取消长时间的手术和手术
  • 你怎么能停止等待长时间的手术呢
  • 在第一种情况下,如果API不支持长操作,则不能取消该操作。DB或文件API可能提供其调用的异步版本,但如果API不允许,则不能取消调用本身。您可能必须让操作保持运行,然后继续执行代码的其余部分,实质上放弃其结果

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


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

    除了等待任务到达可以响应取消请求的点之外,任何类型的强制取消看起来都不是很优雅。您必须重写线程执行的代码,以定期检查挂起的取消。例如,分块编写文件或执行几个较小的SELECT查询。我同意它不会100%优雅。正因为如此,我希望能够进行干预并释放资源。您必须同意,正如我上面所描述的,有些场景不需要等待它们完成。