private async Task DoSomething() { await Task.Delay(TimeSpan.FromSeconds(10)); }3.async/await会创建新的线程吗?
4.asp.net mvc/webapi action中使用async/await会提高请求的响应速度吗?
不会。在启动时看到大量并发请求的 web 应用中,或具有突发负载(其中并发增长突然增加)时,使 web 服务调用异步会提高应用程序的响应能力。异步请求与同步请求所需的处理时间相同。 如果请求发出需要两秒钟时间才能完成的 web 服务调用,则该请求将需要两秒钟,无论是同步执行还是异步执行。但是,在异步调用期间,线程在等待第一个请求完成时不会被阻止响应其他请求。因此,当有多个并发请求调用长时间运行的操作时,异步请求会阻止请求队列和线程池的增长。
public ActionResult Index() { DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间 var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID DoSomething();//耗时操作 DateTime endTime = DateTime.Now;//完成DoSomething方法的时间 var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID return Content($"startTime:{ startTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } startThreadId:{ startThreadId }<br/>endTime:{ endTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } endThreadId:{ endThreadId }<br/><br/>"); } /// <summary> /// 耗时操作 /// </summary> /// <returns></returns> private void DoSomething() { Thread.Sleep(10000); }使用浏览器开3个标签页进行测试(因为浏览器对同一域名下的连接数有限制,一般是6个左右,所以就弄3个吧):
public async Task<ActionResult> Index() { DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间 var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID await DoSomething();//耗时操作 DateTime endTime = DateTime.Now;//完成DoSomething方法的时间 var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID return Content($"startTime:{ startTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } startThreadId:{ startThreadId } endTime:{ endTime.ToString("yyyy-MM-dd HH:mm:ss:fff") } endThreadId:{ endThreadId }"); } /// <summary> /// 耗时操作 /// </summary> /// <returns></returns> private async Task DoSomething() { await Task.Run(() => Thread.Sleep(10000)); }结果:
await关键字不会阻塞线程直到任务完成。它将方法的其余部分注册为任务的回调,并立即返回。当await的任务最终完成时,它将调用该回调,并因此在其中断时继续执行方法。