J. *_*fer 5 .net controls thread-safety
在学习了如何对Windows Form Controls进行线程安全调用之后兴奋地爆炸,让我想到了......
为什么并非所有对Windows窗体控件的调用都是线程安全的? 有谁能解释为什么?我认为这会减少对这些控件的用户的很多困惑.
这里的问题不是线程安全问题.这些方法都是"线程安全的",因为它们在多个线程上同时调用时不会破坏应用程序的状态 - 只是线程安全包括抛出错误的线程异常(不记得它被调用的内容).
他们拥有的是线程 - 它们只能在一个线程上调用 - 有时也称为UI线程,尽管这是误导性的,因为它意味着只有一个.这主要是因为它们依赖的OS调用具有相同的线程关联规则.
相信我-这是一个很好的事情.当您考虑"UI线程"的主要角色时,一切都开始变得清晰.UI线程作业是通过键盘或鼠标从用户手中获取输入,对其进行操作,并以响应的像素形式产生输出.只有一个用户,该用户只有一组眼睛.用户希望在屏幕上看到他们所做的一切,最重要的是他们希望看到它按照他们的顺序发生.多线程UI会使这很难实现 - 几乎不可能.
问题是当你将后台"工作"线程与UI线程混合时,你需要做一定数量的编组来与UI交谈,因为你必须在UI线程上才能这样做.再说一遍,正如我所说,这是一件好事.有人必须进行这种编组操作,否则用户会看到事情发生的顺序错误而且很糟糕.系统可以肯定地为你做,并在一些WIN32调用它 - 但这有问题.首先,系统无法知道您需要进行编组所需的粒度,因此最终可能会导致效率低下.您的操作可能会在系统可以理解的更高级别上进行编组.其次,编组是昂贵的,它会惩罚正在做正确事情并将所有内容正确地移动到UI线程的开发人员.所以系统尽其所能,检查它是否在正确的线程上,如果不是,则抛出异常.
| 归档时间: |
|
| 查看次数: |
512 次 |
| 最近记录: |