什么是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控件。
使用回调函数的方式编写单个异步操作,似乎看不出来有什么不妥。但是随着异步操作的增加,我们就会遇到下面这样的代码。👇👇👇
private void DownloadButton_Click(object sender, RoutedEventArgs e)
{
...
task1.ContinueWith((t) => {
...
task2.ContinueWith(t =>
{
...
task3.ContinueWith(t =>
{
...
task4.ContinueWith(t =>
{
...
});
});
});
}, TaskScheduler.FromCurrentSynchronizationContext