asp.net html5 异步,asp.net core 系列 5 项目实战之:NetCore 的 async 和 await(参考自:Microsoft教程)...
十年河東,十年河西,莫欺少年窮
學無止境,精益求精
1、簡介
從 VS 2012 開始,新引入了一個簡化的方法,稱為異步編程。我們在 >= .NETFRM 4.5 中和 Windows 運行時中使用異步,編譯器它會幫助了我們降低了曾經進行的高難度異步代碼編寫的工作,但邏輯結構卻類似于同步代碼。因此,我們僅需要進行一小部分編程的工作就可以獲得異步編程的所有優點。
對于同步的代碼,大家肯定都不陌生,因為我們平常寫的代碼大部分都是同步的,然而同步代碼卻存在一個很嚴重的問題,例如我們向一個Web服務器發出一個請求時,如果我們發出請求的代碼是同步實現的話,這時候我們的應用程序就會處于等待狀態,直到收回一個響應信息為止,然而在這個等待的狀態,對于用戶不能操作任何的UI界面以及也沒有任何的消息,如果我們試圖去操作界面時,此時我們就會看到”應用程序為響應”的信息(在應用程序的窗口旁),相信大家在平常使用桌面軟件或者訪問web的時候,肯定都遇到過這樣類似的情況的,對于這個,大家肯定會覺得看上去非常不舒服。引起這個原因正是因為代碼的實現是同步實現的,所以在沒有得到一個響應消息之前,界面就成了一個”卡死”狀態了,所以這對于用戶來說肯定是不可接受的
2、優勢
異步編程最大的優勢其實就是提供系統執行效率,畢竟一個串行執行的程序不如并行來的快。譬如:一個人要干十件事情不如十個人各干一件事情效率高。
3、關鍵字
C# 中的?async?和?await?關鍵字都是異步編程的核心。通過使用這兩個關鍵字,我們就可以在 .NET 輕松創建異步方法。
4、返回值類型
4.1、Void
如果在觸發后,你懶得管,請使用 void。
void返回類型主要用在事件處理程序中,一種稱為“fire and forget”(觸發并忘記)的活動的方法。除了它之外,我們都應該盡可能是用Task,作為我們異步方法的返回值。
4.2、Task
你如果只是想知道執行的狀態,而不需要一個具體的返回結果時,請使用Task。
與void對比呢,Task可以使用await進行等待新線程執行完畢。而void不需要等待。
4.3、Task
當你添加async關鍵字后,需要返回一個將用于后續操作的對象,請使用Task。
主要有兩種方式獲取結果值,一個是使用Result屬性,一個是使用await。他們的區別在于:如果你使用的是Result,它帶有阻塞性,即在任務完成之前進行訪問讀取它,當前處于活動狀態的線程都會出現阻塞的情形,一直到結果值可用。所以,在絕大多數情況下,除非你有絕對的理由告訴自己,否則都應該使用await,而不是屬性Result來讀取結果值。
5、范例
再進行范例之前,先寫一個錯誤的異步方法,如下:
public static asyncTask SyncExec_3()
{
Proc();
}public static voidProc()
{for (int i = 0; i < 1000; i++)
{
Console.WriteLine(i);
}
}
View Code
由上圖截圖可以,在異步方法內,需要使用await關鍵字,否則方法會同步執行。
不是說你把一個方法標記成async這個方法就成了異步調用的方法了。async這個關鍵詞其實反而是可以省略的,這個關鍵詞存在的意義是為了向下兼容,為await提供上下文而已。
如下兩個方法其實是一樣的
Task DelayAndCalculate1(int a, intb)
{return Task.Delay(1000).ContinueWith(t => a +b);
}async Task DelayAndCalculate2(int a, intb)
{await Task.Delay(1000);return a +b;
}
View Code
那么,既然async是可以省略的,那么await可以省略嗎?答案是不可以,否則你的方法會被編譯警告,會成為一個同步方法。
其實真正重要的是await,有沒有async反而確實不重要。既然微軟提供了這樣的語法糖,所以建議大家在寫異步方法是加上async。
下面我們通過實例來說明異步編程,如下:
5.1、首先驗證異步編程是并行至執行的
usingSystem;usingSystem.Diagnostics;usingSystem.Threading.Tasks;namespaceConsoleCore
{classProgram
{static void Main(string[] args)
{
Stopwatch sw= newStopwatch();
sw.Start();
SyncExec();var result =SyncExec_2();
sw.Stop();
TimeSpan ts2=sw.Elapsed;
Console.WriteLine("sw總共花費{0}ms.", ts2.TotalMilliseconds);
Console.Read();
}public static voidProc()
{for (int i = 0; i < 1000; i++)
{
Console.WriteLine(i);
}
}#region 異步方法
public static async voidSyncExec()
{await Task.Run(() =>{
Proc();
});
}public static asyncTask SyncExec_2()
{await Task.Run(() =>{
Proc();
});
}#endregion}
}
View Code
我們在Console.Read();處加上斷點,運行如下:
結果:
如上所示,兩個計數程序幾乎同時執行,且在未執行完畢后,計時程序已經執行完畢了,從而說明異步程序是并行執行的,因此:異步程序可以提高效率。
5.2、返回值為Task的程序具體返回了什么?
public static asyncTask SyncExec_2()
{await Task.Run(() =>{
Proc();
});
}
View Code
通過調試,快速監視,得到如下消息:
其實返回值為Task的方法中什么也沒返回,但是我們確定接收到他的返回值,這點似乎是個矛盾點。根據VS快速監視截圖,我們發現我們接收的東西是一個上下文線程。
5.3、異步執行的順序
總結
以上是生活随笔為你收集整理的asp.net html5 异步,asp.net core 系列 5 项目实战之:NetCore 的 async 和 await(参考自:Microsoft教程)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机科学与应用论文的素材,计算机专业学
- 下一篇: html固定且居中布局含footer,如