C#同步,異步的理解,包括5.0中await和async(學習筆記)。本站提示廣大學習愛好者:(C#同步,異步的理解,包括5.0中await和async(學習筆記))文章只能為提供參考,不一定能成為您想要的結果。以下是C#同步,異步的理解,包括5.0中await和async(學習筆記)正文
之前在工作中一直用的是同步線程,就是先進入畫面的load事件,然後在裡面進行數據庫調用的處理。後面又遇到了公司軟件中一些比較古老的代碼,一開始在那塊古老代碼中增加機能的時候,我想用到數據庫的數據給畫面賦上某些值,然後按照之前的常規方法去弄,發現不可以。詢問了前輩,發現是異步的方式解決的。前輩說異步對於用戶的感官上是最理想的,後面用同步線程是因為軟件比較復雜,而且涉及的數據比較龐大,部分機能如果拿不到前面取得數據,是完全不可以進行下去的,所以用異步解決顯得特別繁瑣,然後改用了同步線程。
同步:方法名(BLL層,BLL層的方法,dto),形成畫面與取數據:A-A1-B-B1-A2,UI線程是A系列,取數據是B系列,同步的話就是在UI線程順序執行的過程中放入取數據的線程,不取完數據UI線程是沒有辦法結束掉的。
異步:方法名(BLL層,BLL層的方法,畫面層的異步方法,dto),形成畫面與取數據:A-A1----------A2,在省略號出與A1並列插出一條新的線程B-B1,然後到A2之前拿到B1的數據,最後執行完整個流程。一開始我以為異步就是A系列一條線程,B系列一條線程,兩者是互不干擾的,然後前輩告訴我並不是這樣的,A系列執行完之前還是要B系列最終的數據,否則整個線程不會結束。所以我用異步做彈出一個新的畫面順帶還要把數據立即顯示在畫面的這個機能的時候,畫面上有個grid數據表,用來顯示數據的,會出現一個看著比較讓人難過的現象,就是畫面彈出來的瞬間,grid上的數據顯示出來的時候,grid表本身會抖動一下,就是從空白到填充數據的瞬間,然後結束整個事件,這是完全符合剛剛描述A與B系列的流程的。
所以自己在完成這個機能,個人覺得在涉及到畫面與數據的時候還是同步給人的感覺更好。。
後面回去學習總結的時候,又了解了C#5.0中兩個新的關鍵字,也是關於異步線程的,await和async,這兩個關鍵字是一對雙胞胎的感覺,缺一不可,
static void Main(string[] args)
{
DisplayValue();
Console.WriteLine("AddValueAsync Start!");
Console.ReadLine();
}
static Task<int> AddValueAsync(int num1, int num2)
{
return Task.Run(() =>
{
return num1 + num2;
});
}
static async void DisplayValue()
{
Console.WriteLine("Programme Start!");
Console.WriteLine("*********************************");
double result = await AddValueAsync(1, 2);
Console.WriteLine("Value is : " + result);
Console.WriteLine("AddValueAsync End!");
Console.WriteLine("*********************************");
}
執行結果是:
Programme Start!
*********************************
AddValueAsync Start!
Value is : 3
AddValueAsync End!
*********************************
一開始學習的這兩個關鍵字的時候,以為程序的執行結果會是:
AddValueAsync Start!
*********************************
Programme Start!
Value is : 3
AddValueAsync End!
*********************************
最後發現自己一開始設想的結果是完全錯誤的,async修飾的方法根本不會立刻異步掉,當進入一個async修飾的方法裡面時,遇到的第一個await關鍵字修飾的方法時,才回回到主線程繼續執行,而await後面的則會額外開一個線程執行。當然在VS裡面進行單步調試的時候,打下面兩個方法的斷點,會發現不會回到mian方法裡面執行 Console.WriteLine("AddValueAsync Start!")這句話,發現整個進程會一直往下走,然後彈出命令控制窗口結束掉。但是在出結果的時候,會發現它還是執行了。如果AddValueAsync再用async修飾,裡面再嵌套await方法,最後線程會出現重復利用,假設有方法1,2,3,方法1是線程1,方法2還是線程2,但是方法3不會是線程3,而是線程1。
新人第一次總結學習筆記,如果有不對的地方,熱烈歡迎指出錯誤的地方,謝謝~~~