诺禾致源、运用async/await异步编程

.NET Web应用中为什么要运用async/await异步编程
前言
什么是async/await?
await和async是.NET Framework4.5框架、C#5.0语法里面呈现的技术,目的是用于简化异步编程模型。

async和await的关系?
async和await是成对呈现的。
async呈现在办法的声明里,用于批注一个异步办法。光有async是没有意义的。
await呈现在办法内部,Task前面。只能在运用async关键字批注的办法中运用await关键字。

    private async Task DoSomething()
    {
        await Task.Delay(TimeSpan.FromSeconds(10));
    }

async/await会创立新的线程吗?
不会。async/await关键字自身是不会创立新的线程的,但是被await的办法内部普通会创立新的线程。

asp.net mvc/webapi action中运用async/await会进步恳求的响应速度吗?
不会。

正题
我们都晓得web应用不同于winform、wpf等客户端应用,客户端应用为了保证UI渲染的分歧性常常都是采用单线程形式,这个UI线程称为主线程,假如在主线程做耗时操作就会招致程序界面假死,所以客户端开发中运用多线程异步编程十分必要。
可web应用自身就是多线程形式,效劳器会为每个恳求分配工作线程。
既然async/await不能创立新线程,又不能使进步恳求的响应速度,那.NET Web应用中为什么要运用async/await异步编程呢?

在 web 效劳器上,.NET Framework 维护用于处置 ASP.NET 恳求的线程池。 当恳求抵达时,将调度池中的线程以处置该恳求。 假如以同步方式处置恳求,则处置恳求的线程将在处置恳求时处于忙碌状态,并且该线程无法处置其他恳求。

在启动时看到大量并发恳求的 web 应用中,或具有突发负载(其中并发增长忽然增加)时,使 web 效劳调用异步会进步应用程序的响应才能。 异步恳求与同步恳求所需的处置时间相同。 假如恳求发出需求两秒钟时间才干完成的 web 效劳调用,则该恳求将需求两秒钟,无论是同步执行还是异步执行。 但是,在异步伐用期间,线程在等候第一个恳求完成时不会被阻止响应其他恳求。 因而,当有多个并发恳求调用长时间运转的操作时,异步恳求会阻止恳求队列和线程池的增长。

下面用代码来实践测试一下:

先是同步的方式,代码很简单,就是输出一下恳求开端和完毕的时间和线程ID:
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 }
endTime:{ endTime.ToString(“yyyy-MM-dd HH:mm:ss:fff”) } endThreadId:{ endThreadId }

");
}
///

    /// 耗时操作
    /// 
    /// 
    private void DoSomething()
    {
        Thread.Sleep(10000);
    }

你可能感兴趣的:(.net)