您现在的位置: 365建站网 > 365学习 > 如何解决WinForm窗体显示时黑屏或白屏反应慢问题

如何解决WinForm窗体显示时黑屏或白屏反应慢问题

文章来源:365jz.com     点击数:232    更新时间:2021-08-03 10:36   参与评论

WinForm窗体显示时,时不时黑屏或者白屏,反应慢等问题的解决方案

网上有很多人说了各种解决方案,都无效,其根本原因是因为Panel控件本身的问题,把Panel控件改成Control就可以了,亲测有效

鉴于很多项目都运行了很长时间,只有Panel控件都改成Control最快的方式是在winform.Designer.cs文件里把Panel的声明和创建都改成Control即可。

无效的解决方案1:

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲

无效的解决方案2:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams paras = base.CreateParams;
        paras.ExStyle |= 0x02000000;
        return paras;
    }
}

image.png

WinForm窗体在使用过程中如果因为程序等待时间太久而导致窗体本身假死无法控制,会严重影响用户的体验,这种情况大多是UI线程被耗时长的代码操作占用所致,可以新开一个线程用来完成耗时长的操作,然后再将结果返回到UI中呈现,这样就不会占用到UI线程了,也就不会假死了,涉及Control的更新需要用到BeginInvoke方法

private void button1_Click(object sender, EventArgs e)
{
    Thread t1 = new Thread(delegate ()
    {
        bu1_Click();
    }
    );
    t1.IsBackground = true; //当主线程退出时,后台线程会被CLR调用Abort()来彻底终止程序
    t1.Start();}


 = =

Control.BeginInvoke函数内的线程跟UI线程是同一个线程的,函数外的代码所在进程则是另一个t1进程,所以异步在这里体现的是Control.BeginInvoke相对于t1线程的异步,并不是相对于UI线程的异步。


如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (232人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------