如何强制停止一个任务?

11

我正在使用带有提供了CancellationTokenSourceTask,并且在我的任务中,我总是检查是否请求取消并停止执行 - 在我可控制的代码部分。问题是,在这个任务中,我使用了来自不支持取消并编译为.NET 3.5的库的非常长时间运行的方法(我使用的是4.5.1)。

根据输入,这些方法可能运行几分钟(有时超过10分钟)。如果结果永远不会被使用,我不想让这么多处理工作白费。

是否有其他方法强制终止一个Task?也许我最好在我的任务中创建一个线程来运行这些方法,并在请求取消时杀死这些线程。


3
正如Stephen Cleary在这个问题的评论中所提到的,没有一种简洁的方法来终止长时间运行的未考虑取消操作的工作... - Patryk Ćwiek
所以你正在使用一个基于.NET 3.5的第三方库。由于在.NET 3.5中没有Task,那么这个库暴露了什么样的API呢?是BeginXXX/EndXXX APM模式吗? - noseratio - open to work
这不是第三方的,而是内部开发的。我不能更改库,因为它正在生产中使用。它不使用任何设计模式,也没有使用任何线程。它只是读取几个XML文件并将其解析到内存中,以便稍后访问数据。 - ldam
2个回答

4

你唯一的选择是将这些不可取消的函数包装在单独的线程中,在取消时只需终止该线程。正如其他人提到的那样,Thread.Abort是一个极其不安全的操作。它终止线程而不允许执行可能需要的任何资源清理。这应该是最后的选择。根据您中止的时间,程序可能会处于不良状态。


1
当然这并不是很安全的。Thread.Abort 是一项危险的操作,特别是在未知代码上运行时。 - Luaan
这不是未知的代码,我有完整的源代码和所有内容。只是因为现有的代码正在生产中,所以我无法更改它。 - ldam
你是指不能修改旧的方法,还是不能将它们移植到.NET 4.5? - NickC
我两个都做不了 :( - ldam

2

这取决于你的具体实现,但是你可以尝试在长时间操作超时后抛出异常(只要它能处理好),并在你控制的代码中捕获它。

你可以在这个问题中找到例子:Async network operations never finish


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接