发现一个非常有意思的问题。还百度不到 码拜 9年 ago 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协议进行授权 , 转载请注明发现一个非常有意思的问题。还百度不到!