可能的重复:
为什么.NET不允许跨线程操作? https://stackoverflow.com/questions/2896504/why-net-does-not-allow-cross-thread-operations
为什么只允许UI线程修改UI? https://stackoverflow.com/questions/3794420/why-is-only-the-ui-thread-allowed-to-modify-the-ui
据我了解,.net 引发非法跨线程调用异常的原因是 GUI 可能会显示不确定的行为。
但其他所有物体不都是这样吗?如果两个线程处理同一个对象,则根据代码,该对象可能处于不确定的情况。那么为什么控制元素会存在这种异常呢?或者为什么这个异常是控制元素独有的。
使用 invoke 有什么帮助?它仍然是不确定的。
Invoke
- 需要对其他线程进行控制,因为不允许跨线程调用控件 https://stackoverflow.com/questions/3794420/why-is-only-the-ui-thread-allowed-to-modify-the-ui。要更完整地讨论为什么存在此限制,您应该阅读该链接 - 我不会在这里回答这个问题,它只是is(不过请放心,此限制的存在是有充分理由的)。
Calling Invoke
对我们有帮助,因为它允许后台线程在 UI 线程上“做事”——它之所以有效,是因为它不直接调用该方法,而是发送一个窗口消息 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644927%28v=vs.85%29.aspx上面写着“当你有机会时运行这个”。 UI 线程正在运行消息泵 https://stackoverflow.com/questions/2222365/what-is-a-message-pump它连续处理发送到该线程的所有消息 - 通常这些消息是这样的“用户点击了这个按钮” http://msdn.microsoft.com/en-us/library/windows/desktop/ms645607%28v=vs.85%29.aspx,在这种情况下,Windows 窗体通过引发Click
相关控件上的事件。在这种情况下,Windows 窗体通过运行提供的委托来处理消息。
结果是在任何一个时间点只有 1 个线程正在修改/使用 UI 控件(UI 线程)。
注意Invoke http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx不保证代表的运行顺序。如果两名代表很重要Invoked
如果两个不同的线程(甚至同一个线程)以正确的顺序执行,那么这是一个不同的问题。
Aside:我们谈论“UI 线程”是因为大多数应用程序都有一个线程,在该线程上创建所有控件,但实际上可以创建不同的控件线程 - 它是在处理消息的线程上创建控件的线程。显然,为了正确处理这些消息,必须在该线程上运行消息泵。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)