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