C#用异步操作解决界面卡顿问题

新建窗体

1 放一个按钮button事件如下,界面卡死

  private  void button1_Click(object sender, EventArgs e)
        {
            int i = 0;
            while (true)
            {
                Thread.Sleep(20);
                i++;
                if (i > 8000) return;
            }

        }

2 增加Application.DoEvents();,界面卡消失

 private  void button1_Click(object sender, EventArgs e)
        {
            int i = 0;
            while (true)
            {
                Thread.Sleep(20);
                Application.DoEvents();
                i++;
                if (i > 8000) return;
            }

        }

3 使用线程调用等待函数,虽然有Application.DoEvents();,使用task.wait依然界面卡死

 public void Waits()
        {
            int i = 0;
            while (true)
            {
                Thread.Sleep(20);
                Application.DoEvents();
                i++;
                if (i > 8000) return;
            }
        }
        private  void button1_Click(object sender, EventArgs e)
        {

            button1.Enabled = false;
            Task yy = new Task (() => { Waits(); });
            yy.Start();
            yy.Wait();
            button1.Enabled = true;

        }

4 使用异步线程操作,卡消失

 public void Waits()
        {
            int i = 0;
            while (true)
            {
                Thread.Sleep(20);
                Application.DoEvents();
                i++;
                if (i > 8000) return;
            }
        }
        private async void button1_Click(object sender, EventArgs e)
        {

            button1.Enabled = false;
            Task<int> yy = new Task<int>(() => { Waits(); return 0; });
            yy.Start();
            await yy;
            button1.Enabled = true;

        }

5 最后使用异步线程操作,等待函数内不使用Application.DoEvents()也不会卡死

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值