C#中异步调用async、await的使用小例子

C#5.0引入了async和await关键字,这可以让我们用很少的代码实现异步编程,假设再同步编程中,点击按钮后要运行耗时5s的运算,这时候界面就会卡死,等着5s的运算结束后用户才能继续操作界面,而用异步编程的话,点完按钮后,着5s的运算会在另一个线程中执行,同时用户可以立即操作界面。

废话不多说,上代码:

硬件:ThinkPad T570

系统:Win10

开发环境:VS2019

新建一个winform程序,Form1.cs中代码如下:

        private void button1_Click(object sender, EventArgs e)
        {
            Trace.WriteLine("button1_Click");
            asyncMethod();
            Trace.WriteLine("after button1_Click");
            button1.Text = "button";
        }
        private async Task asyncMethod()
        {
            Trace.WriteLine("async Task asyncMethod");
            button1.Text =  await SleepMethod();
            Trace.WriteLine("after async Task asyncMethod");
        }
        private Task<string> SleepMethod()
        {
            Trace.WriteLine("SleepMethod");
            var t = Task.Run(() => {
                Thread.Sleep(5000);
                Trace.WriteLine("after sleep 5s");
                return "after sleep 5s";
            });
            Trace.WriteLine("after Task.Run()");
            return t;
        }

执行顺序如下:

button1_Click
async Task asyncMethod
SleepMethod
after Task.Run()
after button1_Click
after sleep 5s
after async Task asyncMethod

在用async声明的函数中有await函数,当执行到await行时候,代码会启动一个task任务执行异步任务,同时代码执行权回到调用异步函数中去继续执行不必等待task任务执行结束,当task执行结束后会自动调用await后面的代码,相当于传统多线程方式中的回调函数

其实上面3个函数可以简化成一个函数,为button1_Click()函数添加async关键字,然后在函数内部直接加个任务,并用await修饰任务返回值即可:

        private async void button1_Click(object sender, EventArgs e)
        {
            var t = Task.Run(() =>
            {
                Thread.Sleep(5000);
                return "after sleep 5s";
            });
            button1.Text = await t;
        }

注意,这时候整个button1_Click()函数是个异步函数,如果这时候,在函数最后添加button1.Text = "button";的话,该代码还是会等button1.Text = await t;执行完之后再执行!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenHandBruce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值