我想在后台运行一个长时间运行的opeartion。 要求是:
操作应该与调用线程异步运行。
调用线程可以等待操作完成并获得其结果
超时后,应立即中止操作。
我会使用任务,但我知道没有任何机制可以杀死死亡的任务。 取消令牌不适合我,我只会因为未知原因而卡住任务 - (一个bug),这是一个故障安全机制。 针说如果任务被卡住,请求取消没有用。 BackgroundWorker也是如此。
有没有比在调用线程和后台线程之间使用共享对象更精细的东西?
答案 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#,表明这通常是不好的做法除非在极少数情况下使用它。
另一种选择是避免尝试杀死任务死机,并在任务中实现更好的错误处理,以便它能够优雅地处理异常情况以及“卡住”的情况。