C# Async/Await原理剖析

什么是Async/Await

Async/Await是C# 5引入的关键字,用以提高用户界面响应能力和对Web资源的访问能力,同时它使异步代码的编写变得更加容易。

为什么需要Async/Await

1. 需要使用异步编程技术来提高程序的响应能力
在Windows桌面应用中,当click download button时,我们不希望其导致整个ui失去响应。我们希望ui线程能够实时的响应窗体事件,而不会被下载等耗时的IO操作所阻塞。这就需要我们使用异步编程技术来编写程序, 使其不阻塞当前线程,从而提高程序的响应能力。

2. 需要一种足够简单且易于理解的方式编写异步代码
在没有async/await的时代我们是如何实现异步的?下面的代码还是以Windows桌面应用为🌰,当click download button 时,应用发送网络请求获取project数据并show在windows窗体中。

private void DownloadButton_Click(object sender, RoutedEventArgs e)
{
   
   
    ...
    Task<Project> task = projectService.GetAsync(id);
    
    task.ContinueWith((t) => {
   
   
        var project = t.Result;
        ProjectBox.Items.Add(project);
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

TaskScheduler.FromCurrentSynchronizationContext()表示回调代码将会在当前同步上下文中执行,如果去掉此参数,可能导致程序抛出异常。原因是将回调代码安排到线程池中的非UI线程时,它无法访问UI控件。

更多内容:ExecutionContext vs SynchronizationContext

使用回调函数的方式编写单个异步操作,似乎看不出来有什么不妥。但是随着异步操作的增加,我们就会遇到下面这样的代码。👇👇👇

private void DownloadButton_Click(object sender, RoutedEventArgs e)
{
   
   
    ...
    task1.ContinueWith((t) => {
   
   
        ...
        task2.ContinueWith(t =>
        {
   
   
            ...
            task3.ContinueWith(t =>
            {
   
   
                ...
               	task4.ContinueWith(t =>
                {
   
   
					...
                });
            });
        });
    }, TaskScheduler.FromCurrentSynchronizationContext
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值