UI卡顿假死问题
误区1:使用不同的线程操作UI控件和耗时操作(即,跨线程操作UI控件CheckForIllegalCrossThreadCalls =
false
;
),
注意:此处只是为了记录......
原始同步操作如下所示:
private void button1_Click(object sender, EventArgs e) { Waintting waitting = new Waintting(); waitting.Show(); Thread.Sleep(5000);//模拟等待 MessageBox.Show("连接数据库成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); waitting.BeginInvoke((Action)waitting.Close);//BeginInvoke方法返回UI线程更新UI界面控件的机制。 }
调整后异步方式如下所示:
private void btnWatting_Click(object sender, EventArgs e) { Waintting waitting = new Waintting(); waitting.Show(); Task.Factory.StartNew(() => // 将阻塞线程的操作在另外一个线程中执行,这样就不会堵塞UI线程。 { Thread.Sleep(5000);//模拟等待 MessageBox.Show("连接数据库成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information); waitting.BeginInvoke((Action)waitting.Close);//BeginInvoke方法返回UI线程更新UI界面控件的机制。 }); }
运行效果如下所示:
方式二:异步回调
private void WattingTest2_Click(object sender, EventArgs e) { Func<string> wait = () => { Thread.Sleep(5000);//模拟耗时操作,例如数据库操作等 return "abc"; }; wait.BeginInvoke(new AsyncCallback(result => { string rst = wait.EndInvoke(result); this.Invoke((Action)(() => this.textBox1.AppendText(rst))); }), null); }