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