中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#多線程開發之線程基礎的示例分析

發布時間:2021-09-03 13:22:14 來源:億速云 閱讀:124 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關C#多線程開發之線程基礎的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

    線程基礎

    進程是操作系統分配資源的最小單元,線程是操作系統調度的最小單元” 這句話應該學習計算機的朋友或多或少都聽說過,這在操作系統這門課中是很重要的一個概念。

    在操作系統中可以同時運行很多個應用程序,那么你知道計算機是如何分配和調度這些應用程序去使用CPU進行工作的嗎?

    這里面就牽扯到了進程、線程的概念,也就是我們接下來要學習的內容。

    一個應用程序會有很多個線程,但是只能有一個進程。也就是說一個進程中可以有很多個線程。那么這是為什么呢?以前計算機只有一個計算模塊,每次只能單一的執行一個計算單元,不能同時執行多個計算任務。現在隨著科技的發展,有了多核CPU,可以一次性執行多個應用程序,這樣就實現了多任務。操作系統為了不讓一個應用程序獨占CPU,導致其余程序掛起等待,不得不設計出一種將物理計算單元分割為一些虛擬的進程,并給予每個執行程序一定量的計算能力。此外,操作系統必須始終能夠優先訪問CPU,并能調整不同程序訪問CPU的優先級(說白了就是典型的以空間換時間)。

    線程正是這一概念的實現,可以認為線程是一個虛擬的進程,用于獨立運行一個特定的程序。

    大量使用線程會消耗大量的OS資源

    那么為什么需要使用線程呢!其實就是為了在相同的時間內,讓操作系統或CPU干更多的活,那么在C#中線程應該如何使用或者說在什么場景下使用呢!

    在C#中關于線程的使用,大多數時候是在當程序需要處理大量繁瑣、占用資源多、花費大量時間的任務時進行應用,比如訪問數據庫,視頻顯示,文件IO操作、網絡傳輸等。

    線程在應用程序中可以進行如何操作:1、創建線程;2、暫停線程;3、線程等待;4、終止線程。

    1、創建線程

    通過聲明并實例化Thread就可以創建線程,它接收方法作為參數。使用Thread.Start()就可以開啟子線程,讓其去執行方法中的內容。

    static void Main(string[] args)
            {            
                //新創建的線程中輸出
                Thread oneThread = new Thread(PrintNumber);
                oneThread.Start();
    
                //主線程中輸出
                PrintNumber();
                Console.ReadKey();
            }
    
            static void PrintNumber() 
            {
                Console.WriteLine("開始......");
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(i);
                }
            }

    C#多線程開發之線程基礎的示例分析

    可以看到當我們在子線程和主線程中同時輸出PrintNumber()中的內容時,它是亂的隨機交叉輸出的。

    2、暫停線程

    暫停線程故名思意就是讓線程暫停,不讓其占用CPU資源,在一直等待,啥時候取消暫停就恢復運行。在C#中暫停就是讓這個線程進入睡眠狀態,讓其休眠,不讓其占用系統資源就可以了。

      Thread.Sleep(TimeSpan.FromSeconds(2));    //睡眠2s

    3、線程等待

    線程等待就是多個線程在處理某個任務時,某個線程必須等待前一個線程處理所有數據后才可以進行執行,在這個期間,這個線程是阻塞狀態的。只有前一個線程完事了,他才可以再繼續執行。

    static void Main(string[] args)
            {            
                //新創建的線程中輸出
                Thread oneThread = new Thread(PrintNumber);
                oneThread.Start();
                oneThread.Join();
    
                //主線程中輸出
                PrintNumber();
                Console.ReadKey();
            }

    也就是說上面的程序主線程必須得等oneThread線程執行完PrintNumber方法后,它才可以執行。

    4、線程終止

    就是線程在執行過程中,利用某些操作(Thread.Abort())可以使其線程立即退出,不進行工作了。

    static void Main(string[] args)
            {            
                //新創建的線程中輸出
                Thread oneThread = new Thread(PrintNumber);
                oneThread.Start();
    
                Thread.Sleep(TimeSpan.FromSeconds(6));
                oneThread.Abort();
    
                //主線程中輸出
                PrintNumber();
                Console.ReadKey();
            }

    上面的程序可以看到,當主程序再等待6s后,立即將oneThread線程終止掉。

    其實Abort()方法是給線程注入了ThreadAbortException方法,導致線程被終結,這其實很危險,因為該線程可能正在處理某些重要的數據,比如接收傳輸數據等,這樣子就傳遞摧毀了程序,數據也就丟失了。還有就是這個方法不能保證100%終止線程。有時候有些異常會被吃掉,我們可以利用某些關鍵變量在子線程中進行控制,從而取消線程的執行就可以。

    在實際編碼使用線程的過程中,可以通過oneThread.ThreadState來獲取目前線程的狀態。有時候我們也可以手動的設置線程的優先級,設置為最高的則提前執行,但是這個只是針對于單核CPU時,目前市面上基本都是多核的了,這種使用場景也就很少了。

    一般我們創建的線程都是屬于前臺線程,通過手動設置ontThread對象的IsBackground屬性為true時才會為后臺線程。通常前臺線程會比后臺線程提前執行完。當前臺線程執行完成后,程序結束并且后臺線程被終結。進程會等待所有的前臺線程完成后再結束工作,但是如果只剩下后臺線程,進程會直接結束工作。

    C#中的lock關鍵字

    某一個資源當被多個線程同時訪問時,可能這個資源的某些值對于各個線程來說會出問題。如果在某一時刻,一個線程是使其遞增,一個線程是遞減,會導致其值不唯一,各個線程拿到的值不對。這種情況就是所謂的競爭條件,競爭條件是多線程環境中非常常見的導致錯誤的原因。

    class PepoleCount 
        {
            int count = 0;
            public void AddCount() 
            {
                ++count;            
            }
            public void DeleteCount() 
            {
                --count;
            }    
        }

    比如是上面的程序,當兩個線程同時訪問這個PepoleCount類時,會導致count變量出現競爭條件。就是每個線程可能拿到的數值不是最新的。那么如何辦呢,此時就需要使用到lock機制,也就是加鎖。目的是為了當一個線程訪問某個資源時,其余線程如果在訪問時,必須等待當前訪問完事后,它才可以訪問。保證了數據的有效性。

    lock關鍵字是如果鎖定了一個對象,需要訪問該對象的所有其他線程則會處于阻塞狀態,并等待知道該對象解除鎖定才可以訪問。

    class PepoleCount 
        {
            private readonly object _syncRoot = new object();
            int count = 0;
            public void AddCount() 
            {
                lock(_syncRoot)
                {
                    ++count;            
                }            
            }
            public void DeleteCount() 
            {
                lock(_syncRoot)
                {
                --count;
                }
            }    
        }

    關于加鎖這塊還是有很多講究的,不是說每一個方法,每一個變量都需要進行加鎖,如果頻繁的加鎖會導致其余線程處于阻塞狀態,那么也會導致應用程序出現嚴重的性能問題。

    感謝各位的閱讀!關于“C#多線程開發之線程基礎的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    宜兰市| 临城县| 重庆市| 锦屏县| 平定县| 瓦房店市| 巴彦县| 抚远县| 静乐县| 南宫市| 专栏| 普宁市| 广灵县| 茂名市| 乾安县| 屏边| 厦门市| 五家渠市| 松溪县| 旺苍县| 锦州市| 金沙县| 松阳县| 聊城市| 攀枝花市| 乌海市| 牡丹江市| 莒南县| 邹平县| 桑植县| 永顺县| 天峻县| 马关县| 元谋县| 开封县| 南乐县| 安图县| 泽普县| 临颍县| 阳高县| 呈贡县|