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; } }
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線程的異步。
如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇