爲了搞清.net的執行順序咱們作以下準備異步
1,作3個任務,分別往3個文本文件寫入100萬行時間戳,每一個任務根據計算大概須要400+毫秒。async
DateTime dt1;
private void dowork1() { using (System.IO.StreamWriter writer = File.AppendText("newfile1.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now-dt1).Milliseconds.ToString()); } writer.Close(); } } private void dowork2() { using (System.IO.StreamWriter writer = File.AppendText("newfile2.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now - dt1).Milliseconds.ToString()); } writer.Close(); } } private void dowork3() { using (System.IO.StreamWriter writer = File.AppendText("newfile3.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now - dt1).Milliseconds.ToString()); } writer.Close(); } }
2,採用以下方法調用者三個任務:以線程的方式調用任務1,而後調用任務2,最後調用任務3。.net
dt1 = DateTime.Now; Task t1 = new Task(dowork1); t1.Start(); dowork2(); dowork3();
3,最終得出第一個結果:線程
查看每一個任務寫入文本文件的時間戳就很容易發現:orm
4,那麼異步的執行順序是如何的呢?blog
咱們用下面的代碼當模擬一項工做,耗時5s同步
private Task Worker1() { return Task.Run(()=> { System.Threading.Thread.Sleep(5000); }); }
而後在winform裏面把工做狀態顯示出來。很明顯執行到這裏的時候label1變成"Worker starting to work",五秒後變成"Worker done"it
label1.Text = "Worker starting to work"; await Worker1(); label1.Text = "Worker done";
5,最終得出第二個結果,採用async/await異步的時候是順序執行的,好處是能夠跟同步任務同樣理解,又不至於引發UI卡死form