UI卡顿假死问题

UI卡顿假死问题

误区1:使用不同的线程操作UI控件和耗时操作(即,跨线程操作UI控件CheckForIllegalCrossThreadCalls = false;),

注意:此处只是为了记录......

原始同步操作如下所示:

1
2
3
4
5
6
7
8
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界面控件的机制。  
        }

调整后异步方式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
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界面控件的机制。  
            });
 
        }UI卡顿假死问题

运行效果如下所示:

方式二:异步回调

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
       }

  

参考:https://www.cnblogs.com/YYkun/p/10782653.html

 

 

本文作者:Hello Word

本文链接:https://www.cnblogs.com/xfweb/p/15915047.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   浅绿色i  阅读(142)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起