winform跨线程访问控件 在多线程中,子线程更新主线程ui有哪些方法及注意点?
在多线程中,子线程更新主线程ui有哪些方法及注意点?
我先给你个提示。Android只能用UI线程(即主线程)更新UI。让我们这样说:UI线程==主线程。
1. 如果要在子线程中的数据发生变化时更新主线程的UI,可以使用消息机制以及消息和处理程序的组合。
2. 还可以使用特定的控制方法,例如listview适配器中的notifydatachang()。好像就是这个方法
3。在视图中,还可以在数据更改后使用invalidatea()或postinvalidata()。
基本上,我希望我能帮助您解决这些常见问题。我们来讨论一下。
为什么更新UI都放在主线程中?
在UIKit这样大的框架中确保线程安全是一项重要任务,这将带来巨大的成本。UIKit不是线程安全的。如果在两个线程中设置相同的背景图像,程序将崩溃,因为背景图像被释放两次。或者一个线程遍历以找到一个子视图,但该子视图在另一个线程中被删除,这将导致混乱。Apple可以将大多数绘图方法和类(如uicolor)重写为线程安全的,但仍建议将UI操作保留在主线程中。事实上,如果要更新子线程中的其他UI,必须等到子线程结束,并且响应用户单击的按钮的UI更新是及时的。无论是在主线程还是在子线程中,它都没有什么意义,因为子线程中的所有其他UI更新都必须等到子线程的生命周期结束。在子线程中更新UI是不可能的。我们看到的UI更新是在执行子线程的代码之后,它自动进入主线程并在子线程中执行UI更新的函数堆栈。两者之间的时间非常短,这使得人们错误地认为线程分割过程可以更新UI。如果子线程一直在运行,则无法通知子线程中UI更新函数堆栈的主线程,即无法更新。只有少数用户界面可以直接更新,因为打开一个线程,就会得到当前的环境。例如,当点击一个按钮时,这个按钮的响应方式是打开一个子线程,子线程中这个按钮的UI更新可以及时完成,比如改变上面的背景图片,但是没有任何意义。
winform跨线程访问控件 winform ui dp和px的关系
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。