寫兩個方法
第一個
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個線程 那么就是先第一部分 然后第二部分了
歡迎補充...
