并行編程awit&async相關(guān)文章
C#異步編程
今天晚上沒事寫了個測試的代碼,又看了看.net的并行編程,兩個方法,一個是異步async修飾的,另一個是普通的方法,在控制臺程序的Main方法里去調(diào)用這兩個方法,會有什么結(jié)果呢?
首先我們看一下方法的組成,step1如下
public async void Step1() { try { //await進(jìn)行等待后,新線程的異常可以被主線程捕捉,這是正常的,下面的代碼不會被執(zhí)行 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); }
我們可以看到step2很簡單,不會有什么延時,就是在屏幕上輸出一段話,而step1就顯得復(fù)雜一些了,它是一個異步的方法,并且使用Task.Run開啟了兩個新線程,而第一
個線程的運(yùn)行時間是3秒,很長呀,哈哈,第二個是在屏幕上輸出一段話!現(xiàn)在我們把step1和step2寫在一起會出現(xiàn)什么情況呢?
var test = new ThreadTest(); test.Step1();//整個方法不阻塞,但方法內(nèi)部有可能阻塞 test.Step2();
通過上面的圖我們認(rèn)識到了,step1按著順序先執(zhí)行,而由于第一個線程要執(zhí)行3秒,這時step2被并行執(zhí)行,3秒后,step1的第二個線程繼續(xù)執(zhí)行(由于使用了await,所以step1內(nèi)部進(jìn)行了等待,不會應(yīng)響他外面的方法,也應(yīng)響不了,呵呵!
怎么了,看了上面的例如,是不是對并行編程有了新的認(rèn)識呢!
新聞熱點(diǎn)
疑難解答
圖片精選