C# winform窗體假死
我們經常會遇到當執行一個比較大的函數時,窗體會出現假死的現象,給用戶的體驗不是很好,於是我們遇到了問題,那么就必須解決,我們該如何解決呢,首先在自己的腦里畫個問號,接下來我們就一起研究吧!
先分析,這個問題是如何出現的呢!為什么會出現,如何避免出現,避免不了的,如何解決等,下面我們就去解決問題吧,遇到問題不要怕,解決問題是我們成長最快的時候,曾經別人告訴我,不怕不會做,就怕想不到。那我們就進入正題吧!
窗體假死是如何出現的呢?
在調用 testc();函數時,阻塞了UI線程,所以會出現窗體假死現象。(你在吃飯就不能去買東西。)
問題找到了,接下來我們就要想如何解決呢!
思路:1.你在吃飯的時候就不能去買東西,所以我們就必須先吃完飯,再去買。(調用DoEvents函數;主動調用Application.DoEvents 會有線程安全問題。)
思路:2.我可以找個人去幫我買東西。這就是委托,委托一個人去幫你買東西。(新開一個線程)
切記:沒有必要的時候,請盡可能的少用線程。線程不易控制。
方案一:調用方法:DoEvents
Application.DoEvents();

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; this.label1.Text = "aaaaa"; Application.DoEvents(); testc(); } private void testc() { for (int i = 0; i < 10; i++) { Thread.Sleep(10000); MessageBox.Show("a"); } } }
方案二:新開一個線程;

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; this.label1.Text = "aaaaa"; Thread tr = new Thread(testc); tr.Start(); } private void testc() { for (int i = 0; i < 10; i++) { Thread.Sleep(10000); MessageBox.Show("a"); } } }