ome*_*fer 1 c# multithreading task-parallel-library
我想在后台运行一个长期运行的opeartion.要求是:
该操作应该与调用线程异步运行.
调用线程可以等待操作完成并获得其结果
超时后,应立即中止操作.
我本来会使用任务,但我知道没有机制可以杀死任务死冷.取消令牌不适合我,我只会因为未知原因而卡住任务 - (一个bug),这是一个故障安全机制.针说如果任务被卡住,请求取消没有用.BackgroundWorker也是如此.
有没有比在调用线程和后台线程之间使用共享对象更精细的东西?
没有比使用共享对象更优雅的了,因为使用共享对象是这样做的优雅方式:)
你无法提供一种安全地杀死任务的通用方法:由于杀手线程在尝试杀死它时没有任何关于killee正在做什么的线索,这可能会使你的对象模型处于"损坏"状态.
Thread.Abort()已经创建,以尽可能最干净的方式:通过抛出异常(允许"finally"语句处置已使用的资源,或在被杀死的线程上运行事务处理).但是这种方法可以使代码在意外的位置抛出异常.强烈建议不要这样做.
nb:Thread.Abort()在任何情况下都不起作用(例如:如果您的线程通过P/Invoke运行本机代码,则不会工作)
因此,优雅的解决方案是编写干净的代码,它可以决定何时被杀死(通过取消令牌).
nb2:终极"Thread.Abort()"在任何情况下都可以工作,它将保持隔离:创建一个新的AppDomain,在这个AppDomain中运行你的可填充代码(通过远程处理),然后调用AppDomain.Unload()当你想要阻止一切.
不过,这是一个非常极端的解决方案.