发现一个非常有意思的问题。还百度不到

.Net技术 码拜 9年前 (2016-06-03) 890次浏览
WINFORM里的一个问题。
 A控件的初始状态 本人是给的隐藏。
本人是直接关闭的跨线程访问。
然后在一线程中 只做了一件事 就是修改A控件的Visible为true  也就是改为可见
然后线程开始后   居然没反应
于是本人给了个休眠时间 例如2秒   奇怪的是A控件居然真就显示了2秒 然后就消失了  这是何解?
解决方案

10

线程中修改控件必须使用异步回调Invoke或BeginInvoke方法

10

引用:
Quote: 引用:
引用:
Quote: 引用:

线程切换时代码执行是“乱序”的,不是随便任何一个简单测试都能重现同一个问题的同一个场景的。代码多少不同、代码(每一次)执行实际速度不同、机器条件不同,都会影响这个乱序的结果。
乱序才是永恒的。
假如使用规范的编程方式,按照要求来在子线程中操作 UI 控件,就没有任何乱序问题了。

听你这么说 感觉很有道理。有点像抢占式的意思 。

不是抢占。你的设置 Visible的代码也许先执行,但是它即可能在其它线程的操作界面的代码之前执行、也可能最后才执行完毕,那么你调试时就搞不清楚结果到底应该怎么样才判断。
这不是“抢占”的问题,是并发的问题。
举个例子,假设你银行卡里有1000块钱,现在有一个人往里边存100块,同时有另一个人从里边取50块,问一下结果是1050,还是1100,还是950?
结果完全不确定。
此时就需要 Invoke/BeginInvoke 这种规范的排队操作机制,每一个人的操作都会保持前后一致性,最终一定是 1050。这里的关键其实是在于“排队”,而不在于“抢占”。不管怎么样抢占,结果都是1050,不会错的。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明发现一个非常有意思的问题。还百度不到
喜欢 (0)
[1034331897@qq.com]
分享 (0)