c# async await 理解 結合並行處理


寫兩個方法

第一個

List<int> list = new List<int>();
int i= 0;
do
{
    i++;
    list.Add(i);
} while (i< 10);
Console.WriteLine("開始執行時間:" + DateTime.Now.ToString());
Parallel.ForEach(list, async item =>
{
    var result = await Test();
    Console.WriteLine("線程" + result.ToString());
});

第二個

public static async Task<string> Test()
{
    return await Task.Run(() =>
      {
          Thread.Sleep(2000);
          Console.WriteLine("Test()方法里面線程ID: {0}", Thread.CurrentThread.ManagedThreadId);
          Console.WriteLine("執行時間:" + DateTime.Now.ToString());
          return Thread.CurrentThread.ManagedThreadId.ToString();
      });
}

  

 

可以區分來看

Test() 是一個部分

await  Test()又是一部分

這兩部分運行的位置不一樣,第一部分就跟我們平時調用一樣,在當前線程直接執行,第二部分的執行取決於我們await的對象,執行的位置也在await對象內部。

這樣子不太好看

主線程碰到await后會立刻返回,以非阻塞的形式執行后面的代碼。

在Task對象前面用 await會阻塞線程,直到Task中的異步操作結束。程序才會繼續執行。(也就是第二部分里面的r的方法對象是阻塞的,只有運行完才會繼續執行)

附上運行圖

第一次

第二次

可能覺得看的有點迷茫

我們改一下代碼 Console.WriteLine("Test()方法里面線程ID: {0},時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString());

第三次執行

發現在執行第二部分的時候,存在不是同步的情況

理論上第二部分是同步的 

這里出現異步的情況是因為並行

我同時執行了10個線程 

然后每個線程都執行第一部分 然后在執行第二部分

如果僅僅只是執行1個線程 那么就是先第一部分 然后第二部分了

 

 

歡迎補充...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM