WinForm窗体显示时,时不时黑屏或者白屏,反应慢等问题的解决方案
网上有很多人说了各种解决方案,都无效,其根本原因是因为Panel控件本身的问题,把Panel控件改成Control就可以了,亲测有效
鉴于很多项目都运行了很长时间,只有Panel控件都改成Control最快的方式是在winform.Designer.cs文件里把Panel的声明和创建都改成Control即可。
无效的解决方案1:
</>code
- SetStyle(ControlStyles.UserPaint, true);
- SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
- SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
无效的解决方案2:
</>code
- protected override CreateParams CreateParams
- {
- get
- {
- CreateParams paras = base.CreateParams;
- paras.ExStyle |= 0x02000000;
- return paras;
- }
- }
WinForm窗体在使用过程中如果因为程序等待时间太久而导致窗体本身假死无法控制,会严重影响用户的体验,这种情况大多是UI线程被耗时长的代码操作占用所致,可以新开一个线程用来完成耗时长的操作,然后再将结果返回到UI中呈现,这样就不会占用到UI线程了,也就不会假死了,涉及Control的更新需要用到BeginInvoke方法
</>code
- private void button1_Click(object sender, EventArgs e)
- {
- Thread t1 = new Thread(delegate ()
- {
- bu1_Click();
- }
- );
- t1.IsBackground = true; //当主线程退出时,后台线程会被CLR调用Abort()来彻底终止程序
- t1.Start();}
</>code
- = =
Control.BeginInvoke函数内的线程跟UI线程是同一个线程的,函数外的代码所在进程则是另一个t1进程,所以异步在这里体现的是Control.BeginInvoke相对于t1线程的异步,并不是相对于UI线程的异步。
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛