亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#關于Task.Yeild()函數的討論

 更新時間:2020年07月14日 15:05:22   作者:白煙染黑墨  
這篇文章主要介紹了C#中關于Task.Yeild()函數的相關資料,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下

      在與同事討論async/await內部實現的時候,突然想到Task.Yeild()這個函數,為什么呢,了解一點C#async/await內部機制的都知道,在await一個異步任務(函數)的時候,它會先判斷該Task是否已經完成,如果已經完成,則繼續(xù)執(zhí)行下去,不會返回到調用方,原因是盡量避免線程切換,因為await后面部分的代碼很可能是另一個不同的線程執(zhí)行,而Task.Yeild()則可以強制回到調用方,或者說主動讓出執(zhí)行權,給其他Task執(zhí)行的機會,可以把Task理解為協程,Task.Yeild()和Thread.sleep(0)有點相同。

      為了證明我的結論成立,請看代碼:

public static async Task Test1()
{
   await Task.CompletedTask;
   Thread.Sleep(1000);
   Console.WriteLine("Test1任務完成");
}
public static async Task Test2()
{
   await Task.Delay(1);
   Thread.Sleep(1000);
   Console.WriteLine("Test2任務完成");
}
public static async Task Test3()
{
   await Task.Yield();
   Thread.Sleep(1000);
   Console.WriteLine("Test3任務完成");
}
static void Main(string[] args)
{
   Console.WriteLine(DateTime.Now);
   _ = Test1();
   Console.WriteLine(DateTime.Now);
   Console.ReadLine();
}

      按照開頭的理論,Test1()異步函數由于await了一個已經完成的任務,所以會繼續(xù)往下執(zhí)行,阻塞1秒鐘,然后回到調用方,打印的時間之差會相隔一秒。

      Test2()異步函數由于await了一個未完成的任務(1ms對于CPU來說是很長的了),所以會返回調用方,然后打印相同的時間,一秒鐘之后會打印執(zhí)行完畢。

      Test3()調用了Task.Yeild()函數,主動讓出執(zhí)行權,所以會直接返回調用方,然后打印相同的時間,一秒之后會打印執(zhí)行完畢。

      可以看到,開頭的結論是正確的。那么,有什么意義呢?Yeild的意思在這里其實就是退讓,讓出的意思,讓出什么呢?就是讓出執(zhí)行權,這與Thread.sleep(0)讓出CPU執(zhí)行權給其他線程(前提是有其他線程競爭)有機會執(zhí)行是一個道理。

      請看我的例子:

public static async Task OP1()
{
   while (true)
   {
     await Task.Yield();//這里會捕捉同步上下文,由于是控制臺程序,沒有同步上下文,所以默認的線程池任務調度器變成同步上下文
                   //也就是說后面的代碼將會在線程池上執(zhí)行,由于線程池工作線程數量設置為1,所以必須主動讓出執(zhí)行權,讓其他的
                   //任務有執(zhí)行的機會
     Console.WriteLine("OP1在執(zhí)行");
     Thread.Sleep(1000);//模擬一些需要占用CPU的操作
   }
}
public static async Task OP2()
{
   while (true)
   {
     await Task.Yield();
     Console.WriteLine("OP2在執(zhí)行");
     Thread.Sleep(1000);
   }
}
static async Task Main(string[] args)
{
   ThreadPool.SetMinThreads(1, 1);
   ThreadPool.SetMaxThreads(1, 1);
   //Task.Run()方法默認使用線程池任務調度器執(zhí)行任務,由于主線程不是線程池線程,所以使用Task.Run()
   var t = Task.Run(async () =>
   {
     var t1 = OP1();
     var t2 = OP2();
     await Task.WhenAll(t1, t2);
   });
   await t;
   Console.ReadLine();
}

      可以看出OP1()和OP2()兩個協程(Task)互相爭用一個線程(用戶模式下的CPU),如果不主動讓出執(zhí)行權,另一個協程(Task)將不會有機會執(zhí)行。

      例如:

public static async Task OP2()
{
   while (true)
   {
     await Task.CompletedTask;//或者是直接去掉
     Console.WriteLine($"OP2在執(zhí)行 {DateTime.Now}");
     Thread.Sleep(1000);
   }
}

      這樣OP1()將永遠不會有機會執(zhí)行。

以上就是C#中關于Task.Yeild()函數的討論的詳細內容,更多關于C# Task.Yeild()的資料請關注腳本之家其它相關文章!

相關文章

  • C#之如何實現真正的四舍五入

    C#之如何實現真正的四舍五入

    這篇文章主要介紹了C#之如何實現真正的四舍五入問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • C#中把Datatable轉換為Json的5個代碼實例

    C#中把Datatable轉換為Json的5個代碼實例

    這篇文章主要介紹了C#中把Datatable轉換為Json的5個代碼實例,需要的朋友可以參考下
    2014-04-04
  • wpf實現超低延遲的RTMP或RTSP播放

    wpf實現超低延遲的RTMP或RTSP播放

    這篇文章主要為大家詳細介紹了wpf如何實現超低延遲的RTMP或RTSP播放,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • C#創(chuàng)建、部署、調用WebService圖文實例詳解

    C#創(chuàng)建、部署、調用WebService圖文實例詳解

    本文主要用詳細的圖文給大家介紹C#創(chuàng)建、部署、調用WebService的全部過程以及中間需要避免的問題。
    2017-11-11
  • C#文件操作類分享

    C#文件操作類分享

    這篇文章主要為大家分享了C#文件操作類的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#使用XML文件的操作詳解及示例

    C#使用XML文件的操作詳解及示例

    XML是 Extensible Markup Language 的簡稱,用于存儲和傳輸數據的可擴展標記語言,它被應用在數據交換、數據存儲、Web服務、網絡協議等場景,本文給大家介紹了C#使用XML文件的操作詳解及示例,需要的朋友可以參考下
    2024-10-10
  • C#實現在啟動目錄創(chuàng)建快捷方式的方法

    C#實現在啟動目錄創(chuàng)建快捷方式的方法

    這篇文章主要介紹了C#實現在啟動目錄創(chuàng)建快捷方式的方法,涉及C#快捷方式的創(chuàng)建技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 詳解C#如何在不同工作簿之間復制選定單元格區(qū)域

    詳解C#如何在不同工作簿之間復制選定單元格區(qū)域

    處理Excel文檔時,我們經常需要將數據整合到一個工作表以便于我們進行管理或數據對比。本文將演示如何通過編程方式將選定的單元格區(qū)域從一個工作簿復制到另一個工作簿
    2023-02-02
  • C#使用NPOI上傳excel

    C#使用NPOI上傳excel

    這篇文章主要為大家詳細介紹了C#使用NPOI上傳excel的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • WPF使用WinSCP實現FTP下載

    WPF使用WinSCP實現FTP下載

    這篇文章主要為大家詳細介紹了WPF如何使用WinSCP實現FTP下載,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-01-01

最新評論