多线程访问控件

chanQ 2009-05-12 11:46:45
线程A在销毁窗体控件的过程中另一个线程又在访问该控件
导致异常:无法访问已经释放的对象
有什么好办法可以解决的吗?
...全文
104 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CGabriel 2009-05-16
  • 打赏
  • 举报
回复
我想你应该先看一下 MSDN 上对于 Control 的一段说明:


注意:
控件上的大多数方法只能从创建控件的线程调用。如果已经创建控件的句柄,则除了 InvokeRequired 属性以外,控件上还有四个可以从任何线程上安全调用的方法,它们是:Invoke、BeginInvoke、EndInvoke 和 CreateGraphics。在后台线程上创建控件的句柄之前调用 CreateGraphics 可能会导致非法的跨线程调用。对于所有其他方法调用,则应使用调用 (invoke) 方法之一封送对控件的线程的调用。调用方法始终在控件的线程上调用自己的回调。


如果你真的想在另外一条线程上操作控件, 应该使用 Control.Invoke 封装并且发送至主线程执行, 那样是一个安全的调用。 不存在控件被线程A销毁,却为完成销毁动作的时候,被线程B调用产生的异常。

因为用 Control.Invoke 封装之后,是在同一条线程上执行,只需要在每次使用前判定是否为 null 即可
chanQ 2009-05-13
  • 打赏
  • 举报
回复
主线程以外的线程在主线程开始销毁Control时有没有办法可以判断Control正在销毁
貌似用IsDisposed属性无法知晓是否销毁
CGabriel 2009-05-13
  • 打赏
  • 举报
回复
正如异常信息已经说得很明白了, 让你在释放之前检查一下是否已经释放。

PS: 在主线程以外访问 Control 本来就是主动要异常...

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧