private static async Task<TResult> XAsync() { test(); //X()同步方法0 XXAsync();//"异步方法1" return await XXXAsync(); //XXAsync()异步方法2 }
1.c#程序运行会产生一个主线程,如果是同步方法运行,方法体的的所有方法,都会由主线程去完成,整个方法完成后才会释放主线程。
如何理解主线程已完成呢?Asp.net Mvc 的机制就在这里,我们都知道,IIS里的线程池是有限的,每次的Client端请求,都会到线程池里取一个空闲的线程,如果主线程一直在”占用“线程池,
很快线程池就会被利用完啦。此时我们平时说的”吞吐量“的高低就是与此息息相关!当线程池被请求完后,再次有新的Client端请求,要会等待线程池的释放。
而mvc 就引用了控制器里异步方法的机制,原理就是让耗时的线程,直接返回,交给主线程,从而主线程会第一时间释放线程池的占用,而耗时的子线程完成时,将会在await标记从继续运行,