异步,在计算机编程中,是指独立于主程序流程和处理此类事件的方式的事件的发生。这些可能是“外部”事件,例如信号的到达,或者由程序发起的与程序执行同时发生的动作,而程序不会阻塞以等待结果(from 维基百科)。这里比较重要的就是最后一句,程序不会阻塞以等待结果。如下图所示,同步(synchronous)就是需要在processB执行完并返回结果后才会继续执行后续的processA,一旦processB的执行发生意外,整个程序将会阻塞,无法继续执行。而异步(asynchronous)则是在调用processB的同时也能执行其他不需要等待processB返回结果的任务,使整个主流程不会因processB发生的问题而中断。
异步可以用另一个词语来描述,并行:即多个任务同时执行。如上述例子所示,异步代表着,processA不依赖processB结果的部分 与 processB 在同时执行,并行发生。这样的好处并不仅仅在于节省效率,将计算机多余的算力充分应用,更是能优化HTTP协议中的APi调用流程,使用异步方法时,应用程序将继续响应 UI。
2、 如何在C#中使用异步编程在C#中官方已经引入了异步编程, 在.NET Framework 4.5 或更高版本以及 .NET Core中均支持异步编程,且保留了一个类似于同步代码的逻辑结构。C#中对于异步编程有三个重要的关键词:
async: 方法前缀,用于表明该方法是异步方法。
eg:public async Task
await:指定需要执行异步调用的位置。如果在async方法中,并没有使用await关键字,将依然会当成同步方法执行。
eg:string contents = await getStringTask;
Task
###代码示例讲解
原理
当异步方法执行时会将结果委托给他返回的Task,这时不代表该方法已经执行完毕,而是他做出一个承诺,我将会把我执行完后返回的结果存放在该Task中,你可以在后续需要的时候从该Task中获得(前提是已经执行完毕,不然将会等待直到其执行完毕)。而在完成结果的委托之后,该方法将会在后台继续执行,而控制权也已经返回给了异步方法的调用方,调用方可继续执行不依赖于之前异步方法返回值的其他流程。而当调用方已经执行完其他所有不依赖返回结果的方法后,改异步方法仍为执行完毕的话,调用方会同样将结果承诺进一个Task中,将其返回给上一层的调用方法中,逐级传递。因此想要最大化的把异步编程效果体现出来,就应该尽量将异步结果独立出来,并放置在方法最终返回前,以达到在异步完成前其他独立方法都已经执行完的效果。如果await放置在方法靠前的话,将会出现仅小部分采取了异步执行,在await之后的将都是同步执行。



