日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

15.3 Task Task.Yield和Task.Delay说明

發布時間:2025/4/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 15.3 Task Task.Yield和Task.Delay说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://blog.csdn.net/hurrycxd/article/details/79827958

書上看到一個Task.Yield例子,Task.Yield方法創建一個立即返回的awaitable。等待一個Yield可以讓異步方法在執行后續的部分時返回到調用方法。可以理解為離開當前的消息隊列,回到隊列末尾,讓處理器有時間處理其他任務。
Yield方法在GUI編程中非常的有用,可以中斷大量的工作,讓其他任務使用處理器。看下面的代碼:

1 static void Main(string[] args) 2 { 3 Task<int> value = FindSeriesSum(100000); 4 Console.WriteLine("主線其他任務開始"); 5 CountBig(10000); 6 CountBig(10001); 7 CountBig(10002); 8 Thread.Sleep(1000); 9 CountBig(10003); 10 Console.WriteLine("Length =" + value.Result); 11 Console.ReadKey(); 12 } 13 public static async Task<int> FindSeriesSum(int i1) 14 { 15 int sum = 0; 16 for (int i = 0; i < i1; i++) 17 { 18 sum += i1; 19 if (i % 20000 == 0) 20 { 21 await Task.Yield(); 22 Console.WriteLine("i % 20000 :i=" + i); 23 } 24 } 25 WebClient wc = new WebClient(); 26 Console.WriteLine("開始下載任務"); 27 string str = await wc.DownloadStringTaskAsync("https://www.baidu.com"); 28 return str.Length; 29 } 30 private static void CountBig(int p) 31 { 32 for (int i = 0; i < p; i++) 33 { 34 if (i == p - 1) 35 Console.WriteLine("p =" + p); 36 } 37 }

在執行下載任務await wc.DownloadStringTaskAsync("https://github.com/")前進行了大量的CPU運算,那么線程會等到第一個await的時候才會異步執行CountBig(10000);

程序運行的結果如下:

i % 20000 :i=0
i % 20000 :i=20000
i % 20000 :i=40000
i % 20000 :i=60000
i % 20000 :i=80000
開始下載任務
主線其他任務開始
p =10000
p =10001
p =10002
p =10003
Length =52728
我們需要立即返回的awaitable,讓程序執行其他的任務,去掉//await Task.Yield();前面的注釋符,得到的結果如下:

i % 20000 :i=0
主線其他任務開始
p =10000
i % 20000 :i=20000
p =10001
p =10002
i % 20000 :i=40000
i % 20000 :i=60000
i % 20000 :i=80000
開始下載任務
p =10003
Length =52728
可以看到現在開始下載任務之前就可以執行其他的任務了。最大條件的利用了資源。

Task.Delay方法創建一個Task對象,該對象暫停其在線程中的處理。

與Thread.Sleep()阻塞線程不同的是,Task.Delay不會阻塞線程,線程可以繼續處理其它的工作。

1 static void Main(string[] args) 2 { 3 Task<int> value = FindSeriesSum(100000); 4 Console.WriteLine("主線其他任務開始"); 5 CountBig(10000); 6 CountBig(10001); 7 CountBig(10002); 8 Thread.Sleep(1000); 9 CountBig(10003); 10 Console.WriteLine("Length =" + value.Result); 11 Console.ReadKey(); 12 } 13 public static async Task<int> FindSeriesSum(int i1) 14 { 15 await Task.Delay(1000); 16 WebClient wc = new WebClient(); 17 Console.WriteLine("開始下載任務"); 18 string str = await wc.DownloadStringTaskAsync("https://www.baidu.com"); 19 return str.Length; 20 } 21 private static void CountBig(int p) 22 { 23 for (int i = 0; i < p; i++) 24 { 25 if (i == p - 1) 26 Console.WriteLine("p =" + p); 27 } 28 }

主線其他任務開始
p =10000
p =10001
p =10002
開始下載任務
p =10003
Length =52728

轉載于:https://www.cnblogs.com/kikyoqiang/p/10127962.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的15.3 Task Task.Yield和Task.Delay说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。