諾禾致源、運用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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章