对于async和await的理解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiaomifengmaidi1/article/details/100141682

直接先上代码

 [HttpGet]
        public async Task<ActionResult<IEnumerable<string>>> GetAsync()
        {
            try
            {
                logger.LogInformation(Thread.CurrentThread.ManagedThreadId + "----------------" + DateTime.Now);
                Task<string> a = testAsync("a");
                var b = testAsync("b");
                var c = await Task.WhenAll(a, b);//进行阻塞,等待2个完成后继续往下执行
                await testAsync("a");
                await testAsync("b");
                logger.LogInformation(Thread.CurrentThread.ManagedThreadId + "+++++++++++++++++" + DateTime.Now);
                return null;
            }
            catch (Exception ex)
            {
                logger.LogInformation(Thread.CurrentThread.ManagedThreadId + "+++++++++++++++++" + DateTime.Now);
                return null;
            }
        }

 private async Task<string> testAsync(string re)
        {
            await Task.Delay(3000);
            logger.LogInformation(Thread.CurrentThread.ManagedThreadId + "xxxxxxxxxxxxxxxx" + DateTime.Now);
            return re;
        }

上结果:

TestSync.Controllers.ValuesController:Information: 4----------------8/29/2019 2:03:26 PM
TestSync.Controllers.ValuesController:Information: 9xxxxxxxxxxxxxxxx8/29/2019 2:03:29 PM
TestSync.Controllers.ValuesController:Information: 5xxxxxxxxxxxxxxxx8/29/2019 2:03:29 PM
TestSync.Controllers.ValuesController:Information: 5xxxxxxxxxxxxxxxx8/29/2019 2:03:32 PM
TestSync.Controllers.ValuesController:Information: 4xxxxxxxxxxxxxxxx8/29/2019 2:03:35 PM
TestSync.Controllers.ValuesController:Information: 4+++++++++++++++++8/29/2019 2:03:35 PM

TestSync.Controllers.ValuesController:Information: 4----------------8/29/2019 2:03:57 PM
TestSync.Controllers.ValuesController:Information: 9xxxxxxxxxxxxxxxx8/29/2019 2:04:00 PM
TestSync.Controllers.ValuesController:Information: 5xxxxxxxxxxxxxxxx8/29/2019 2:04:00 PM
TestSync.Controllers.ValuesController:Information: 4xxxxxxxxxxxxxxxx8/29/2019 2:04:04 PM
TestSync.Controllers.ValuesController:Information: 4xxxxxxxxxxxxxxxx8/29/2019 2:04:07 PM
TestSync.Controllers.ValuesController:Information: 4+++++++++++++++++8/29/2019 2:04:07 PM

TestSync.Controllers.ValuesController:Information: 5----------------8/29/2019 2:04:35 PM
TestSync.Controllers.ValuesController:Information: 4xxxxxxxxxxxxxxxx8/29/2019 2:04:38 PM
TestSync.Controllers.ValuesController:Information: 9xxxxxxxxxxxxxxxx8/29/2019 2:04:38 PM
TestSync.Controllers.ValuesController:Information: 4xxxxxxxxxxxxxxxx8/29/2019 2:04:42 PM
TestSync.Controllers.ValuesController:Information: 4xxxxxxxxxxxxxxxx8/29/2019 2:04:45 PM
TestSync.Controllers.ValuesController:Information: 4+++++++++++++++++8/29/2019 2:04:45 PM

TestSync.Controllers.ValuesController:Information: 15----------------8/29/2019 2:05:08 PM
TestSync.Controllers.ValuesController:Information: 5xxxxxxxxxxxxxxxx8/29/2019 2:05:10 PM
TestSync.Controllers.ValuesController:Information: 4xxxxxxxxxxxxxxxx8/29/2019 2:05:11 PM
TestSync.Controllers.ValuesController:Information: 14xxxxxxxxxxxxxxxx8/29/2019 2:05:11 PM
TestSync.Controllers.ValuesController:Information: 5xxxxxxxxxxxxxxxx8/29/2019 2:05:13 PM
TestSync.Controllers.ValuesController:Information: 5+++++++++++++++++8/29/2019 2:05:13 PM

说下我自己的理解当执行到await的时候,之前的那个线程会被回收掉,执行await的时候,又会创建一个新的线程,但是里面机制是尽量用之前回收过得线程。

可能和大家理解的异步所有差异,但是其实这个的异步是对于负载而言的,微软的文档上对于这个是这样描述的:

此模型可很好地处理典型的服务器方案工作负荷。 由于没有专用于阻止未完成任务的线程,服务器线程池可服务更多的 Web 请求。
考虑使用两个服务器:一个运行异步代码,一个不运行异步代码。 鉴于本示例的目的,每个服务器只有 5 个可用于服务请求的线程。 请注意,这样小的数目仅可用于演示。
假设两个服务器都接收到 6 个并发请求。 每个请求执行一个 I/O 操作。 未 运行异步代码的服务器必须对第 6 个请求排队,直到 5 个线程中的一个完成了绑定 I/O 的工作并编写了响应。 此时收到了第 20 个请求,由于队列过长,服务器可能会开始变慢。
运行有 异步代码的服务器也需对第 6 个请求排队,但由于使用了 async 和 await,绑定了 I/O 的工作开始时,每个线程都会得到释放,无需等到工作结束。 收到第 20 个请求时,传入请求队列将变得很小(如果其中还有请求的话),且服务器不会变慢。
尽管这是一个人为想象的示例,但在现实世界中其工作方式与此类似。 事实上,相比服务器将线程专用于接收到的每个请求,使用 async 和 await 能够使服务器多处理一个数量级的请求。

https://docs.microsoft.com/en-us/dotnet/standard/async-in-depth

我之前理解的异步的话,我实践下来需要定义一个异步方法,然后调用的时候不通过关键字await阻塞,这样程序会继续往下运行,可以适用一些写入日志的操作。

以上的纯属个人的看法,希望大家指正。

猜你喜欢

转载自blog.csdn.net/xiaomifengmaidi1/article/details/100141682