是否有可能“杀死”BackgroundWorker
?
在我的DoWork
事件中,我无法检查取消标记,因为我有阻止
调用外部COM接口或查询数据库。 CancelAsync
不会取消对COM的调用。
我该怎么办呢?任何建议都将非常感谢。
提前致谢。
答案 0 :(得分:3)
不,你不能杀死BackgroundWorker
线程,你只能尝试取消它,因为你注意到了,但它需要来自后台线程本身的一些交互来停止工作:“工人代码应定期检查CancellationPending属性,看它是否已设置为true。“(c)MSDN
如果您需要完全控制线程,则必须使用Thread
类自行创建。
答案 1 :(得分:1)
我不知道中止线程的安全方法。
后台工作者可以检查它是否应该取消并取消它自己,但如果它不在查询数据库,那么在它返回之前你几乎无能为力。
你可以在ThreadPool线程上工作,只是放弃线程并启动另一个线程,如果不再需要它(确保当它从db查询返回时它检查它是否应该在做任何讨厌的事情之前取消)。当然,您需要平衡性能并管理线程同步。如果沿着这条路走下去,你可以看一下Interlocked静态类来进行有效的临界区锁定。