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