可以同时杀死的任务等效物

时间:2013-11-11 15:55:07

标签: c# multithreading task-parallel-library

我想在后台运行一个长时间运行的opeartion。 要求是:

  1. 操作应该与调用线程异步运行。

  2. 调用线程可以等待操作完成并获得其结果

  3. 超时后,应立即中止操作。

  4. 我会使用任务,但我知道没有任何机制可以杀死死亡的任务。 取消令牌不适合我,我只会因为未知原因而卡住任务 - (一个bug),这是一个故障安全机制。 针说如果任务被卡住,请求取消没有用。 BackgroundWorker也是如此。

    有没有比在调用线程和后台线程之间使用共享对象更精细的东西?

2 个答案:

答案 0 :(得分:5)

没有比使用共享对象更优雅的了,因为使用共享对象是这样做的优雅方式:)

你无法提供一种安全地杀死任务的通用方法:由于杀手线程没有任何关于killee在尝试杀死它时所做的事情的线索,这可能会使你的对象模型处于“损坏”状态。

已经创建了Thread.Abort()以尽可能最干净的方式:通过抛出异常(允许“finally”语句处理已使用的资源,或者在被杀死的线程上运行事务处理)。但是这种方法可以使代码在意外的位置抛出异常。强烈建议不要这样做。

nb :Thread.Abort()在任何情况下都不起作用(例如:如果您的线程通过P / Invoke运行本机代码,则无法工作)

因此, 优雅 解决方案是编写干净的代码,可以决定何时它要杀死(通过取消令牌)

nb2:最终的“Thread.Abort()”在任何情况下都可以工作,并且可以保持隔离:创建一个新的AppDomain,在这个AppDomain中运行你的可填充代码(通过remoting),并在你想要停止一切时调用AppDomain.Unload()。

但这是一个非常极端的解决方案。

答案 1 :(得分:0)

我知道杀死线程'死冷'的唯一方法是Thread.Abort,但是,你会看到很多关于这个相关问题的答案,Killing a Thread C#,表明这通常是不好的做法除非在极少数情况下使用它。

另一种选择是避免尝试杀死任务死机,并在任务中实现更好的错误处理,以便它能够优雅地处理异常情况以及“卡住”的情况。