C#~異步編程再續~async異步方法與同步方法的(de)并行(xing)
今天(tian)晚上沒事寫(xie)了個(ge)(ge)測試(shi)的(de)代碼,又看了看.net的(de)并行編(bian)程,兩個(ge)(ge)方法(fa)(fa)(fa)(fa),一(yi)個(ge)(ge)是異步async修飾的(de),另一(yi)個(ge)(ge)是普通的(de)方法(fa)(fa)(fa)(fa),在控(kong)制(zhi)臺程序(xu)的(de)Main方法(fa)(fa)(fa)(fa)里(li)去調用這兩個(ge)(ge)方法(fa)(fa)(fa)(fa),會有什么結(jie)果呢?
首(shou)先(xian)我們(men)看一下方(fang)法的組(zu)成,step1如下
public async void Step1() { try { //await進行等(deng)待后,新線(xian)程的(de)(de)異常(chang)可(ke)以被(bei)主線(xian)程捕捉,這是(shi)正常(chang)的(de)(de),下面的(de)(de)代碼不會被(bei)執行 await Task.Run(() => { Console.WriteLine("Step1 Current ThreadID" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(3000); }); await Task.Run(() => { Console.WriteLine("Step1 Current ThreadID" + Thread.CurrentThread.ManagedThreadId); Console.WriteLine("ThreadTest.Test Runing"); }); } catch (Exception ex) { Console.WriteLine("ThreadTest" + ex.Message); } }
step2如下
public void Step2() { Console.WriteLine("Step2 Current ThreadID" + Thread.CurrentThread.ManagedThreadId); }
我(wo)們可以看(kan)到step2很簡(jian)單,不(bu)會有(you)什么(me)延時,就是在屏幕上輸出(chu)一段話(hua),而step1就顯得復雜一些了(le),它是一個異步的(de)方法,并(bing)且使用Task.Run開啟了(le)兩(liang)個新線(xian)程,而第一
個線程的運行(xing)時間是(shi)3秒,很(hen)長(chang)呀,哈哈,第二個是(shi)在(zai)屏幕上輸出一段話!現在(zai)我們把step1和step2寫在(zai)一起(qi)會出現什么情(qing)況呢?
var test = new ThreadTest(); test.Step1();//整個方(fang)法(fa)不(bu)阻塞(sai),但方(fang)法(fa)內部(bu)有可能阻塞(sai) test.Step2();
通過上面的圖我們認識到了,step1按著順序先執行,而由于第一個線程要執行3秒,這時step2被并行執行,3秒后,step1的第二個(ge)線程(cheng)繼續執行(由于使用(yong)了(le)(le)await,所(suo)以(yi)step1內部進行了(le)(le)等(deng)待(dai),不會應響他(ta)外面的方法,也應響不了(le)(le),呵呵!
怎么了,看了上面的例如,是不是對并行編程有了新的認識呢!