在 WinForm 中,UI 更新通常是在 UI 线程上进行的,如果你在 UI 线程之外的地方修改了 UI 元素,可能会导致更新有延迟,单纯的使用delegate也不能及时的更新UI。经实践,最终实现方案如下:

                    this.Invoke((MethodInvoker)delegate//跨线程访问需放在委托中
                    {
                        skinListBox1.BeginUpdate();
                        skinListBox1.Items[StuIndex].Text = "此行为示例刷新UI的逻辑";
                        skinListBox1.EndUpdate();
                    });

这其中需要注意的是:

1)通过调用 BeginUpdate 方法,控件将暂时停止绘制,然后你可以执行修改操作。最后,调用 EndUpdate 方法重新启用绘制,从而一次性更新界面,避免多次绘制导致的延迟。

2)并非所有的 WinForm控件都直接提供了 BeginUpdate() 方法,对未提供此方法的控件可考虑暂时禁用界面重绘,待逻辑操作完之后再开启(这一条为思路,未实践)。

3)跨线程的访问需要放在委托中。否则会报错,具体在本示例中会提示:线程间操作无效: 从不是创建控件"skinListBox1"的线程访问它。

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐