让代码更简单

C#异步任务async与await解决跨线程更新UI问题

重要:本文最后更新于2022-11-14 09:03:38,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

很多朋友反馈说C#的线程好难呀,用起来太复杂了。确实,在任何语言里,涉及耗时任务都比较麻烦,为了解决C#中线程使用麻烦的问题,微软在.net4.5中简化了操作,提出了异步任务的思想。

.net4.5以前,如果想要执行一件耗时任务,最常规的做法就是启动一个线程,再通过控件的Invoke方法回调回主线程,然后再操作UI。异步任务的方法可以简化这个过程,看下面的使用。

假如现在按钮1的点击事件我们需要执行一个耗时任务,并且需要获得int类型的返回值。传统的方法是使用线程和委托配合,将返回值Invoke回主线程,交给委托任务执行。

复制
 private void button1_Click(object sender, EventArgs e)
        {    
         //你的代码
        }

使用异步任务的代码,在方法的返回类型前添加一个async标记,然后使用Task类提供的方法,这里使用了lambda表达式,以实现匿名函数,当然也可以常规使用。需要注意的是,使用异步任务的方法必须使用await关键词修饰。await后跟需要等待的耗时任务。

复制
 private async void button1_Click(object sender, EventArgs e)
        {
 await  Task.Run(() =>
            {         
Thread.Sleep(10000);
//你的代码
});
        }

带返回值的异步任务

复制
 private async void button1_Click(object sender, EventArgs e)
        {
 var task = Task.Run(() =>
            {         
//你的代码
Thread.Sleep(10000);
return 123;
});
int i = await task;
        }

异步任务如果不加await关键词,将会被当做同步任务执行,会阻塞主线程。另外异步任务会等待耗时任务执行完成,然后会接着主线程中的代码继续跑,对程序代码的可读性有非常好的提升。使用Thread线程经常会到处找跳到哪里去了,async则不会有这个问题。

感觉很棒!可以赞赏支持我哟~

0 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐