C#~異步編(bian)程再續(xu)~大(da)叔所(suo)理解的并行編(bian)程(Task&Parallel)
并(bing)行(xing)這(zhe)個(ge)概念出(chu)自.net4.5,它(ta)(ta)被封(feng)(feng)裝在(zai)System.Threading.Tasks命名空間里,主要提供一些線程(cheng),異步的方法,或者說(shuo)它(ta)(ta)是對之前Thread進行(xing)的二次封(feng)(feng)裝,為的是讓開發人員更方便的調用(yong)它(ta)(ta),對于異步與多線程(cheng)我們在(zai)之前的幾講(jiang)里已經(jing)介(jie)紹過了,今天主要說(shuo)說(shuo)并(bing)行(xing),并(bing)行(xing)也可(ke)以(yi)叫(jiao)并(bing)行(xing)計算,即對于一個(ge)大任務,使用(yong)多個(ge)線程(cheng)去計算它(ta)(ta),這(zhe)可(ke)以(yi)充分(fen)發揮多核CPU的優勢,可(ke)以(yi)說(shuo)是大事所(suo)趨!
先看一下并行編程(并行計算)的圖像
對于兩個任務,任務1執行需要1秒,任務2執行需要3秒,那么,如果順序執行,它需要的時間為4秒(1+3),而如果是(shi)并(bing)行(xing)編程,那就運行(xing)時間為(wei)3秒,即(ji)(1和3一起運行(xing),取最長的時間),這就是(shi)并(bing)行(xing)計算(suan)的魅(mei)力!
下面看兩(liang)種并行的實現方(fang)式
一 Task實現的并行
#region 并行Task Console.WriteLine(DateTime.Now); var task = Task.WhenAll(Task.Run(() => { Thread.Sleep(1000); }), Task.Run(() => { Thread.Sleep(2000); }));//多個(ge)task并行執行,不阻塞 task.ContinueWith((ctw) =>//當task完成后,執行這(zhe)個回調(diao) { Console.WriteLine("并行完(wan)成" + DateTime.Now); }); Console.WriteLine(DateTime.Now); #endregion
二 Parallel實現的并行
#region 并行Parallel Console.WriteLine(DateTime.Now); Parallel.Invoke(() => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Thread.Sleep(1000); }, () => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); }); Console.WriteLine(DateTime.Now); Console.ReadKey(); #endregion
通過上面的(de)圖(tu)我(wo)們可(ke)以看到,在進行(xing)并行(xing)測試時,運行(xing)時間為兩(liang)秒!