【发布时间】:2011-09-22 19:55:06
【问题描述】:
我需要这样做才能解决死锁。 我的 Windows 窗体控件引用了包含 C++ 本机类的 C++/CLI 类。本机类对 C++/CLI 类进行回调,将它们映射到表单处理的事件。这些回调是从一直运行的线程中调用的。
当我想释放控件时,我取消注册所有事件,这样原生类就不能再回调了。完成后,我会处理 C++/CLI 包装器,这反过来会破坏本机类。在本机类析构函数中,我使用 Windows 事件通知线程结束,并无限期地等待线程结束。
但是,如果线程在处理开始时处于回调的中间,他可能会在Control.Invoke 中停止,然后出现死锁。因此标题问题。这可能吗?如果是这样,我可以这样做:
- 取消注册所有事件(本机线程将无法再回调)
- 等待所有待处理的 .Invokes 完成
- 处置 C++/CLI 包装器
- 销毁 C++ 原生类
- 结束信号线程
- 等待线程结束(不能与
Invoke死锁,因为所有这些都已完成,并且由于事件未注册,因此无法再触发它们)
- 销毁 C++ 原生类
- 幸福
我愿意接受其他解决此问题的建议
【问题讨论】:
标签: .net winforms deadlock invoke dispose