目录
窗体为什么会假死
- 在客户端应用程序中,主线程就是负责接收输入,处理事件,渲染屏幕。
- 为了使主线程能够及时的响应,在开发的过程中会对一些耗时的操作,创建一个或者多个子线程去完 成,比如大量数据的循环操作,后台生成多个文件。
- 为了保证UI线程渲染屏幕的一致性,都是采用单线程的模式,这个UI线程就是主线程。
为什么子线程不能直接更新UI界面
- 这是因为在.Net2.0以后微软加强了安全机制,保障主线程也就是UI线程的安全性,不允许在WinFrom 或者WPF中直接跨线程访问控件的属性。
- 其实还是为了保证UI线程渲染屏幕的一致性。
Control执行Invoke/BeginInvoke假死
- WinForm中Control的Invoke和BeginInvoke都是在UI线程上面执行的。
- 如果委托方法用来获取花费时间较长的数据,然后更新界面,如果在UI线程上调用Control.Invoke 和Control.BeginInvoke,它们依然阻塞UI线程,造成界面的假死。
- 异步是指相对于调用BeginInvoke线程的异步,而不是相对于UI线程的异步。
WinForm解决假死
- 可以设置Control.CheckForIllegalCrossThreadCall的属性为False。使用这种方式当有多个线程尝试对UI 线程进行读取时,容易造成线程争夺资源带来的死锁。CLR默认不允许非UI线程直接访问控件。
- 可以把耗时操作放到Task类型启动的线程里面去执行,然后调用该控件的Invoke方法,在Invoke方 法的内部对该控件的属性赋值。
- 还可以考虑使用async和await来进行异步编程,使用await关键字来确保所有的异步操作都是在调用 另一个方法之前完成的。
窗体事件生命周期
- Load事件在窗口加载时触发,主要用于加载初始数据。
- Show事件在窗口显示时触发。
- Activated事件在窗口获取焦点时触发。
- Deactivate事件在窗口失去焦点时触发。
- FormClosing事件在窗口关闭过程中触发。
- FormClosed事件在窗口关闭完成后触发。
DevExpress常用控件
1. SimpleButton是普通按钮。
2. ButtonEdit是编辑按钮。
3. CheckEdit是复选和单选框。
4. TextEdit是文本框。
5. SpinEdit是数值选择控件。
6. DateEdit是日期控件。
7. TimeEdit是时间控件。
8. ComboBoxEdit是下拉框。
9. LookUpEdit是下拉列表视图。
10. LayoutControl是排版控件。
11. SplitContainerControl是分割容器控件。
12. BarManager是菜单控件。
14. TreeList是树状列表控件。
15. XtraTabControl是Tab页控件。
16. MarqueeProgressBarControl是进度条控件。
17. DXValidationProvider是验证控件。