我如何理解异步代码?

哈Ha!我提请您注意“我如何看待异步代码?!”一词的翻译(并做了一些小更正)由莱斯利·理查森(Leslie Richardson)创作。



在编写响应式应用程序时,异步代码正变得越来越流行。不幸的是,异步编程也带来了其他困难。因此,无论您的经验如何,了解此类代码的工作方式都是艰巨的任务。如果您只是刚开始使用异步代码,或者想加深对您的理解,那么这是对异步编程世界的介绍!



什么是异步代码?



异步编程使您可以执行代码块,而无需停止(或阻塞)正在执行操作的整个线程。关于异步代码的一个普遍误解是它提高了性能,但并非总是如此。相反,异步编程的主要特征是它增加了可以并行执行的任务(吞吐量)数量,而不必阻塞执行这些操作的线程。



您可能会认为异步代码与多线程代码非常相似,毕竟,在两种情况下,许多方法都可以同时执行。实际上,异步编程可以与单线程和多线程应用程序结合使用。这意味着您可以拥有一个单线程异步程序,其中一个线程可以运行并行任务。相反,您还可以拥有一个多线程异步应用程序,其中多个线程可以运行多个并行任务。



为什么要使用异步代码?请举一个例子!



为了有一些类比来演示异步编程,请考虑烤馅饼的过程。此过程将由执行几个步骤(或任务)的线程表示,如下面的代码所示。该代码是正确的,执行该方法后您仍然可以得到美味的蛋糕。但是,由于所有代码都是同步的,因此每行将按顺序执行。换句话说,在等待烤箱完成预热时,您将完全静止不动。但同时,您也可以为面团做面团!



同步MakeCake()方法



图片



同步蛋糕烘焙程序



图片



在现实生活中,您倾向于将此过程划分为多个任务,即在烤箱加热时揉捏面团。或在烤箱中烤馅饼时加糖霜。这样可以提高生产率,并使您更快地烤制蛋糕。这是异步代码派上用场的地方!通过使当前代码异步,我们可以在等待任务结果的同时做其他事情来打发时间,例如在烤箱里烤馅饼。

为此,我们将更改代码,并添加PassTheTime方法。现在,我们的代码将保存任务的状态,启动另一个同步或异步操作,并在需要时获取已保存任务的结果。



异步MakeCake()方法

图片



异步Pie烘焙程序

图片



缺少PassTheTime方法的同步MakeCake方法相比,异步MakeCakeAsync方法可以在不阻塞线程的情况下完成更多任务,从而减少了完成整个方法所需的时间。异步和同步程序的比较







图片



如何在.NET中编写异步代码?



C#允许您使用Task类型以及awaitasync关键字编写异步代码任务类型通知调用者可能的返回类型。它还表明可以在调用方法中继续执行其他操作。该异步关键字是搭配的的await关键字,它通知编译器,我们需要一个方法的返回值,但不会立即进行。结果,我们不需要阻塞调用线程,并且我们可以继续执行其他任务,直到需要期望值为止。最初,异步方法将同步执行,直到找到await关键字... 这正是该方法的执行将异步开始的时刻。



我了解了异步代码!怎么办?



尽管异步蛋糕烘焙应用程序很棒,但现实世界中还有许多其他应用程序也使用异步代码。两个最常见的示例是:



使用HTTP请求的应用程序-根据请求,HTTP调用可能需要很长时间才能处理。使用异步代码允许我们在等待服务器响应时执行其他操作。



HTTP GET请求示例



图片



UI应用程序-WPF应用程序或任何其他使用按钮,文本框和其他UX资源的应用程序也非常适合异步实现。例如,解析文件的WPF应用程序。此过程可能需要一些时间。但是,通过使该操作异步,您仍可以与用户界面进行交互,而无需等待操作完成时完全停止应用程序。



All Articles