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