關於C# 異步操作整理
-
按照個人的理解, 寫一個接口用Task異步操作(態度:接受並且學習,您提出寶貴的經驗與理解,我會認真學習):
在主線程中調用異步方法,如果主線程依賴異步方法的返回值那么你一定會去等待子線程的操作時間,但主線程可以繼續處理自己的業務,增加了線程的利用率也增加了時間的利用率。(就像人們常說的忙里偷閑一樣)
1.1如果一個項目 分層為:WebAPI(接口),Service(業務處理),Domain(基礎操作),ORM。
WebAPI:處理, 接受請求,返回請求結果
Service :拼接操作+數據處理
Domain :基礎業務 (增、刪、改等)操作
ORM: dapper,EF,sqlSugar 等數據訪問ORM 基本夠用(封一下使用類)
1.2分析:
Service中 如果需要多次數據庫操作時, 異步操作就會節省時間同時去請求數據庫, 主線程不堵塞,可以1,2,3的發出請求操作,如果是同步,只能等待第一個出現結果,再去執行下一次操作。然后去等待他們的返回值,再去做一些數據處理加工。最終還是要去等待子的處理結果,假設他們都是相同方法,同步則需要消耗 *3的時間,異步則需要 <3的時間(理想狀態,主線程也會節省部分時間)
2.以下就是一個小的DOME,並不是以上的結果,而是體現異步方法通道的重要性
重點:保證異步方法之間調用通道的通暢
class Program { //Main方法 static void Main(string[] args) { Console.WriteLine(">>>>>>>>>>>>>>>>主線程啟動"); Task<string> task = GetStringAsync1(); Console.WriteLine("<<<<<<<<<<<<<<<<主線程結束"); Console.WriteLine($"GetStringAsync1執行結果:{task.Result}"); } #region 異步方法 static async Task<string> GetStringAsync1() { Console.WriteLine(">>>>>>>>GetStringAsync1方法啟動"); string str = await GetStringAsync2(); Console.WriteLine("<<<<<<<<GetStringAsync1方法結束"); return str; } static async Task<string> GetStringAsync2() { Console.WriteLine(">>>>>>>>GetStringAsync2方法啟動"); string str = await GetStringFromTask(); Console.WriteLine("<<<<<<<<GetStringAsync2方法結束"); return str; } static Task<string> GetStringFromTask() { Console.WriteLine(">>>>GetStringFromTask方法啟動"); Task<string> task = new Task<string>(() => { Console.WriteLine(">>任務線程啟動"); Thread.Sleep(1000); Console.WriteLine("<<任務線程結束"); return "hello world"; }); task.Start(); Console.WriteLine("<<<<GetStringFromTask方法結束"); return task; } #endregion }
2.1結果:
2.2分析:
task.Result獲取異步方法返回值 , await用於等待子線程結果,而主線程不會因為子線程開始而停止繼續執行。
如果通道中出現 .result,則直接堵塞主線程。
3.假設:把代碼調整 調用多個異步方法
//Main方法 static void Main(string[] args) { Console.WriteLine(">>>>>>>>>>>>>>>>主線程啟動"); Task<string> task = GetStringAsync1(); Task<string> task1 = GetStringAsync1(); Task<string> task2 = GetStringAsync1(); Console.WriteLine("<<<<<<<<<<<<<<<<主線程結束"); Console.WriteLine($"GetStringAsync1執行結果:{task.Result}"); }
3.1結果:
3.2分析:
從整體運行時間上,就可以看出來不足3秒,也就2秒多一些,而且也可以看出 第二次調用第三次調用中等待1秒的操作,基本是同時執行完畢。
4.總結一下,在偷時間,充分利用主線程等待與多個子線程之間互不干涉的同時執行的形式。
注:本人也是查看許多大神的文章所理解整理的內容,如果有侵權請聯系我(1054529695@qq.com),也歡迎大家查看。