C# CheckForIllegalCrossThreadCalls的影响和线程的真假确认???

雪狼孤竹 2020-04-15 02:27:39
在公司维护一个十年前的WinForm老程序,并且这个程序经过了多人之手修改。
领导让我修改部分程序,在修改的过程中我发现个问题。这个老程序用了很多的窗体Timer,也有部分线程。
但程序使用了CheckForIllegalCrossThreadCalls = false语句,经查询发现该语句是用于跨线程调用不需要采用委托方式,可以直接调用。
在更新脱机地图的图元状态的时候,使用了一个线程来更新,但发现图元更新的非常慢,没有几个图元,但更新速度就像蜗牛在爬。于是反复的查找更新部分为什么会这么慢,但是没有发现(基于可以直接调用UI的控件)。后来没有办法,试试的心态用了委托方式更新图元。结果是很不错的,至少比原来是快了不少。

说了这么多,其实是想了解一下:
CheckForIllegalCrossThreadCalls = false语句存在的情况下,如上的直接操控UI控件的线程和主线程的关系,在使用委托和不使用委托的区别。

我个人理解,独立创建的线程,在使用上面语句后,直接调用UI控件的更改部分,会导致独立线程的处理和主线程的处理归结到了一起,或者说是等待主线程有空处理,所以才会有独立线程并不独立的情况。不知道我的理解对不对??还请了解的大牛说明!!



...全文
819 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
设置了 CheckForIllegalCrossThreadCalls = false 这就相当与生活在垃圾堆之中,程序的数据和业务逻辑随时会因为线程冲突而胡乱走,结果完全不确定,完全失控。这样设计仅仅对于初学练手的人是“方便”一点儿,或者是根本没有接触过多线程编程的20年前的人刚刚初学线程时才用。
雪狼孤竹 2020-04-19
  • 打赏
  • 举报
回复
引用 1 楼 OrdinaryCoder 的回复:
我看网上的解释是CheckForIllegalCrossThreadCalls =true;的时候 .net会对程序使用UI控件进行安全检查 ,避免跨线程导致的死锁、状态不对的bug 而CheckForIllegalCrossThreadCalls =false;.net不会对程序使用UI控件进行安全检查,全靠程序员自己避免以上bug,实际上还是多个线程对界面控件操作
实际上应该是多线程,不过调用UI控件后,感觉是在一个处理线程下。
OrdinaryCoder 2020-04-15
  • 打赏
  • 举报
回复
我看网上的解释是CheckForIllegalCrossThreadCalls =true;的时候 .net会对程序使用UI控件进行安全检查 ,避免跨线程导致的死锁、状态不对的bug 而CheckForIllegalCrossThreadCalls =false;.net不会对程序使用UI控件进行安全检查,全靠程序员自己避免以上bug,实际上还是多个线程对界面控件操作

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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