C#異步多線程入門(一)

一、什麼是線程?

       線程(Thread)是代碼的執行序列或者執行路徑。線程與進程的概念有一些相似,它類似於一個輕量級的進程:一個操作系統中可以運行多個進程,一個進程內可以運行多個線程。每個應用程序至少運行在一個線程上。當只有一個線程時,稱作單線程應用程序,該線程由系統自動創建。例如下面的.Net Core 控制檯應用程序Main方法。

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Console.WriteLine("我是單線程程序");
        }
    }
}

從線程的生命週期來看這個程序的執行過程如下:

每個線程都有一個入口點,上面的程序來說入口點即Main()方法,,執行Main()方法的線程通常被稱爲主線程(Main Thread),主線程的入口點也是應用程序的起始點。對於單線程程序來說,代碼的執行順序永遠是至上而下的。也就是說,控制檯中肯定是先輸出“Hello World”再輸出“我是一個單線程程序”。

二、多線程的好處

1、使用線程可以把佔據長時間的程序中的任務放到後臺去處理

2、用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度

3、程序的運行速度可能加快

4、在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存佔用等等

上面的程序只是輸出了兩行文字,所以不會感覺到運行時間上的差距。但是如果程序中某個任務需要很長時間完成,那麼後面的執行步驟也得等待這個任務執行完成才能繼續執行。舉個生活中的例子:我們需要做晚飯,分爲煮飯和炒菜兩個環節,其中煮飯需要30分鐘,而炒菜需要20分鐘。用單線程去做的話,必須煮完飯再炒菜,那麼就需要50分鐘。而用多線程的做法是,先下米煮飯,同時炒菜,那樣30分鐘飯菜都好了。

using System;
using System.Threading;

namespace StudyThread
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now);//記錄開始時間
            cookRice();
            friedDsh();
            Console.WriteLine(DateTime.Now);//記錄結束時間
        }
        /// <summary>
        /// 煮飯
        /// </summary>
        public static void cookRice() 
        {
            Console.WriteLine("**********開始煮飯啦**********");
            Thread.Sleep(1000*30);  //讓線程睡眠30秒模擬煮飯時間
            Console.WriteLine("**********飯煮好啦**********");
        }
        /// <summary>
        /// 炒菜
        /// </summary>
        public static void friedDsh()
        {
            Console.WriteLine("**********開始炒菜啦**********");
            Thread.Sleep(1000 * 30);  //讓線程睡眠20秒模擬炒菜時間
            Console.WriteLine("**********菜炒好啦**********");
        }
    }
}

從運行輸出結果可以看出單線程執行,剛好用了一分鐘。

三、線程的基本操作

3.1創建新線程

using System.Threading;

System.Threading命名空間下的Thread類提供了線程的基本操作。通過創建一個
Thread對象,並執行它的Start()方法,可以新建並運行一個新的線程。

還是用上面的煮飯炒菜的例子,代碼修改如下:

using System;
using System.Threading;

namespace StudyThread
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now);//記錄開始時間
            ThreadStart ts = new ThreadStart(friedDsh);//新線程的入口
            Thread worker = new Thread(ts);//創建線程對象
            worker.Start();
            cookRice();
            //friedDsh();
            Console.WriteLine(DateTime.Now);//記錄結束時間
        }
        /// <summary>
        /// 煮飯
        /// </summary>
        public static void cookRice() 
        {
            Console.WriteLine("**********開始煮飯啦**********");
            Thread.Sleep(1000*30);  //讓線程睡眠30秒模擬煮飯時間
            Console.WriteLine("**********飯煮好啦**********");
        }
        /// <summary>
        /// 炒菜
        /// </summary>
        public static void friedDsh()
        {
            Console.WriteLine("**********開始炒菜啦**********");
            Thread.Sleep(1000 * 30);  //讓線程睡眠20秒模擬炒菜時間
            Console.WriteLine("**********菜炒好啦**********");
            Console.WriteLine(DateTime.Now);//記錄結束時間
        }
    }
}

從運行輸出結果可以看出單線程執行,用時是31秒。煮飯和炒菜是同時進行的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章