WinForm窗體顯示時(shí),時(shí)不時(shí)黑屏或者白屏,反應(yīng)慢等問題的解決方案
網(wǎng)上有很多人說了各種解決方案,都無(wú)效,其根本原因是因?yàn)镻anel控件本身的問題,把Panel控件改成Control就可以了,親測(cè)有效
鑒于很多項(xiàng)目都運(yùn)行了很長(zhǎng)時(shí)間,只有Panel控件都改成Control最快的方式是在winform.Designer.cs文件里把Panel的聲明和創(chuàng)建都改成Control即可。
無(wú)效的解決方案1:
SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景. SetStyle(ControlStyles.DoubleBuffer, true); // 雙緩沖
無(wú)效的解決方案2:
protected override CreateParams CreateParams { get { CreateParams paras = base.CreateParams; paras.ExStyle |= 0x02000000; return paras; } }
WinForm窗體在使用過程中如果因?yàn)槌绦虻却龝r(shí)間太久而導(dǎo)致窗體本身假死無(wú)法控制,會(huì)嚴(yán)重影響用戶的體驗(yàn),這種情況大多是UI線程被耗時(shí)長(zhǎng)的代碼操作占用所致,可以新開一個(gè)線程用來完成耗時(shí)長(zhǎng)的操作,然后再將結(jié)果返回到UI中呈現(xiàn),這樣就不會(huì)占用到UI線程了,也就不會(huì)假死了,涉及Control的更新需要用到BeginInvoke方法
private void button1_Click(object sender, EventArgs e) { Thread t1 = new Thread(delegate () { bu1_Click(); } ); t1.IsBackground = true; //當(dāng)主線程退出時(shí),后臺(tái)線程會(huì)被CLR調(diào)用Abort()來徹底終止程序 t1.Start();}
= =
Control.BeginInvoke函數(shù)內(nèi)的線程跟UI線程是同一個(gè)線程的,函數(shù)外的代碼所在進(jìn)程則是另一個(gè)t1進(jìn)程,所以異步在這里體現(xiàn)的是Control.BeginInvoke相對(duì)于t1線程的異步,并不是相對(duì)于UI線程的異步。
如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇