並行編程awit&async相關文章
C#異步編程
今天晚上沒事寫了個測試的代碼,又看了看.net的並行編程,兩個方法,一個是異步async修飾的,另一個是普通的方法,在控制台程序的Main方法裡去調用這兩個方法,會有什麼結果呢?
首先我們看一下方法的組成,step1如下
public async void Step1()
{
try
{
//await進行等待後,新線程的異常可以被主線程捕捉,這是正常的,下面的代碼不會被執行
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就顯得復雜一些了,它是一個異步的方法,並且使用Task.Run開啟了兩個新線程,而第一
個線程的運行時間是3秒,很長呀,哈哈,第二個是在屏幕上輸出一段話!現在我們把step1和step2寫在一起會出現什麼情況呢?
var test = new ThreadTest(); test.Step1();//整個方法不阻塞,但方法內部有可能阻塞 test.Step2();
通過上面的圖我們認識到了,step1按著順序先執行,而由於第一個線程要執行3秒,這時step2被並行執行,3秒後,step1的第二個線程繼續執行(由於使用了await,所以step1內部進行了等待,不會應響他外面的方法,也應響不了,呵呵!
怎麼了,看了上面的例如,是不是對並行編程有了新的認識呢!