C# 的執行順序


為了搞清.net的執行順序我們做如下准備

1,做3個任務,分別往3個文本文件寫入100萬行時間戳,每個任務根據計算大概需要400+毫秒。

        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。

            dt1 = DateTime.Now;            
            Task t1 = new Task(dowork1);
            t1.Start();           
            dowork2();
            dowork3();

3,最終得出第一個結果:

查看每個任務寫入文本文件的時間戳就很容易發現:

  • 任務1和任務2是同步進行的,所以時間戳是一致的。證明采用線程時,主線程和副線程是同步進行的
  • 任務3一直等待,直至任務2完成才開始。任務3的時間戳從任務2的時間戳繼續。證明同一個線程里,是任務是順序執行的。

 4,那么異步的執行順序是如何的呢?

我們用下面的代碼當模擬一項工作,耗時5s

        private Task Worker1()
        {
            return Task.Run(()=>
            {
                System.Threading.Thread.Sleep(5000);
            });
        }

  然后在winform里面把工作狀態顯示出來。很明顯執行到這里的時候label1變成"Worker starting to work",五秒后變成"Worker done"

            label1.Text = "Worker starting to work";
            await Worker1();
            label1.Text = "Worker done";  

  5,最終得出第二個結果,采用async/await異步的時候是順序執行的,好處是可以跟同步任務一樣理解,又不至於引起UI卡死


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM