欢迎莅临 SUN WU GANG 的园子!!!

世上无难事,只畏有心人。有心之人,即立志之坚午也,志坚则不畏事之不成。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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);
        }

  

 

posted on 2019-04-28 10:41  sunwugang  阅读(1807)  评论(0编辑  收藏  举报