C#~異步編程再續~async異步方法與同步方法的並行

返回目錄html

今天晚上沒事寫了個測試的代碼,又看了看.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以下async

 public void Step2()
        {
            Console.WriteLine("Step2 Current ThreadID" + Thread.CurrentThread.ManagedThreadId);
        }

咱們能夠看到step2很簡單,不會有什麼延時,就是在屏幕上輸出一段話,而step1就顯得複雜一些了,它是一個異步的方法,而且使用Task.Run開啓了兩個新線程,而第一測試

個線程的運行時間是3秒,很長呀,哈哈,第二個是在屏幕上輸出一段話!如今咱們把step1和step2寫在一塊兒會出現什麼狀況呢?spa

 var test = new ThreadTest();
 test.Step1();//整個方法不阻塞,但方法內部有可能阻塞
 test.Step2();

經過上面的圖咱們認識到了,step1按着順序先執行,而因爲第一個線程要執行3秒,這時step2被並行執行,3秒後,step1的第二個線程繼續執行(因爲使用了await,因此step1內部進行了等待,不會應響他外面的方法,也應響不了,呵呵!.net

怎麼了,看了上面的例如,是否是對並行編程有了新的認識呢!線程

返回目錄code

相關文章
相關標籤/搜索