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(); }
public void bu1_Click() { label1.BeginInvoke((MethodInvoker)delegate () { label1.Text = "Fetching doc effective date..."; label1.ForeColor = Color.Red; });
Thread.Sleep(3000); }
Control.BeginInvoke函數內的線程跟UI線程是同一個線程的,函數外的代碼所在進程則是另一個t1進程,所以異步在這里體現的是Control.BeginInvoke相對於t1線程的異步,並不是相對於UI線程的異步。
更多詳細知識參考https://blog.csdn.net/newbie_xymt/article/details/81777675