前面一篇文章,了解了任務并行庫,這是異步編程基礎設施,它允許我們以模塊化的方式設計程式,來組合不同的異步操作,解決了以往執行緒之間傳遞訊息難等問題,但是我們在閱讀和撰寫此類程式時還是會覺得非常難理解程式的實際執行順利,總感覺把主動權交給并行庫,總覺得心里面沒底,而且隨著系統的不斷擴大,業務的不斷完善,了解程式的先后執行次序就變得很重要,
C#5.0
在C#5.0中,微軟引入了一個全新的語言特性,異步函式,它是TPL之上的更高級別的抽象,真正簡化了異步編程,
抽象隱藏了主要的實作細節,使得程式員無需考慮許多重要的事情,從而使異步編程更加容易,
async Task<string> GetStringAsync()
{
await Task.Delay(TimeSpan.FromSeconds(2));
return "你好,阿輝";
}
一、async和await
- 在async標識的方法體里面,如果沒有await關鍵字出現,那么這種方法和呼叫普通的方法沒什么區別,
- 在async標識的方法體里面,在await關鍵字出現之前,還是主執行緒順序呼叫執行,知道await關鍵字的出現才會出現執行緒阻塞,
- await關鍵字可以理解為等待方法執行完畢,除了可以標記有async關鍵字的方法外還能標記Task物件,標識等待該執行緒執行完畢,所以await關鍵字并不針對于asyncd的方法,而是針對async方法所回傳給我們的Task,
- async方法的回傳型別必須為void、Task或者Task
型別,說白了,async要么是void,要么和Task關聯,
在async方法外不能使用await關鍵字,否則編譯錯誤,異步函式在代碼中至少要擁有一個await運算子,如果沒有,也不會報錯,只是會提示警告,
在ASP.NET程式中,一旦在代碼中使用了異步,最好一直使用,呼叫異步方法時,應該用await等待它回傳Task物件,一定要避免使用Task.Wait或Task
public ActionResult DeadLock()
{
Task task = WaitAsync();
//同步程式塊,正在等待異步方法完成
task.Wait();
return Content("執行完畢");
}
async Task WaitAsync()
{
await Task.Delay(TimeSpan.FromSeconds(5));
}
在DeadLock()方法中,當執行到task.Wait()方法時,主執行緒會被阻塞,不往下執行,等候WaitAsync()異步方法執行完畢后,才解除阻塞,
在C#5.0中,await和Async是有一定的限制的,
- 不能把控制臺中的Main()方法標記為async.
- 不能在catch、finally、lock或unsafe代碼塊中使用await運算子,
- 不允許對任何異步函式使用ref或out引數,
并不是所有的方法都得上Async的,對于需要異步處理的該使用async/await就使用,不需要的就使用平常方法,平常的方法在性能方面要比async關鍵字方法塊40~50倍,所以我們在平時也要注意不能濫用async,
二、使用await運算子獲取異步任務結果
async static Task WithWait()
{
try
{
string result = await GetInfoAsync("阿輝");
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
async static Task<string> GetInfoAsync(string name)
{
await Task.Delay(TimeSpan.FromSeconds(2));
return name+",你好,";
}
Task t = WithWait();
t.Wait();
這樣就可以獲取到異步任務的回傳值了,使用await后,C#立即創建了一個任務,其有一個后續操作任務,包含了await運算子后面的所有剩余代碼,這個新任務也處理了例外傳播,然后將任務回傳到主方法中并等待其完成,
目前在最新的.NET Core中,基本上所有方法都默認在使用await/async這種模式來撰寫,所以學習這種異步編程方式還是特別有意義的,
好了,今天的學習就到這里,我們下篇文章見,
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的,
原創不易,給個關注,
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝,
作者:阿輝 關注我:微信掃描下面二維碼,6T編程資料免費送, 微信公眾號:Andy阿輝
寫一些程式員的所思所想,希望對你有幫助,
出處:http://www.cnblogs.com/netxiaoahui/ 著作權宣告:本文著作權歸作者和博客園共有,歡迎轉載,
但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/300087.html
標籤:.NET技术
上一篇:如何獲取列舉的描述資訊
