程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#前台線程和後台線程

C#前台線程和後台線程

編輯:C#入門知識

線程默認為前台線程,這意味著任何前台線程在運行都會保持程序存活。

      後台線程:只要有一個前台線程在運行,應用程序的進程就在運行。如果多個前台線程在運行,而Main()方法結束了,應用程序的進程就是激活的,直到所有前台線程完成其任務為止。 Apple蘋果(14)
      前台線程和後台線程的唯一的區別是— 後台線程不會阻止進程終止。

      在默認情況下,用Thread 類創建的線程都是前台線程。線程池中的線程總是後台線程。

      在用Thread類創建線程時,可以設置屬性IsBackground,以確定該線程是(false)前台線程還是(true)後台線程。

using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void myThread()
{

Console.WriteLine("新的線程開始輸出消息");
Console.ReadKey();
Thread.Sleep(4000);//停止4秒中讓主線程可以比NewThread提前結束


Console.WriteLine("新的線程結束輸出消息");
Console.ReadKey();

}

static void Main(string[] args)
{
Thread thread = new Thread(myThread);
thread.Name = "NewThread";

//IsBackground屬性設置為false時 線程 NewThread是可以在主線程執行完畢後打印出兩條消息的
//IsBackground如果為true,則在主線程結束後,就打印不出第二條消息了 因為主線程(前台線程)結束了,
後台線程也就跟著退出了。
thread.IsBackground = false;
thread.Start();

Console.WriteLine("主線程已經結束");
}
}
}

前台線程和後台線程適合的場合

       通常,後台線程非常適合於完成後台任務,應該將被動偵聽活動的線程設置為後台線程,而將負責發送數據的線程設置為前台線程,這樣,在所有的數據發送完畢之前該線程不會被終止。

       例如:如果關閉Word應用程序,拼寫檢查器繼續運行器進程就沒有意義了。在應用程序結束時,拼寫檢查器就可以關閉了。

線程的優先級

       在windows上執行的線程在執行了一定時間(一個時間片)後,windows將會進行“調度”,給線程指定優先級,可以影響這個調度。

       windows按照優先級的高低選擇程序開始運行,也就是說如果存在一個優先級是25的線程能夠執行,那麼windows將不會調用優先級為24的線程。但是windows是一種“搶占式”的操作系

統(在windows上執行的線程能夠在任何時候被搶占),如果一個具有較高優先級的線程准備好運行,並且當前運行的是較低優先級的線程,windows將迫使較低優先級線程停止運行,開始

運行較高優先級的線程。

       由於windows上線程調用是(籠統的講)通過線程的優先級來實現的,那麼如果我們想使我們的程序能夠被盡量多的調度,就需要設置線程的優先級, 顯卡

       在Thread類中,可以設置Priority屬性,以影響線程的基本優先級。Priority屬性需要一個ThreadPriority枚舉定義的值。     
       Highest > AboveNormal >  Normal >  BelowNormal > Lowest

       通常情況下,我們是不需要設置線程的優先級,或者將其設置成Normal優先級。

using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static bool loopSwitch = true;
static void myThread()
{
long threadCount = 0;
//進行加法操作
while (loopSwitch) { threadCount++; }
//顯示結果
Console.WriteLine("{0},優先級:{1}" + "數到:{2}",
Thread.CurrentThread.Name,
Thread.CurrentThread.Priority.ToString(),
threadCount.ToString());
Console.ReadLine();
}

static void Main(string[] args)
{
Thread threadOne = new Thread(myThread);
threadOne.Name = "ThreadOne";

Thread threadTwo = new Thread(myThread);
threadTwo.Name = "ThreadTwo";
threadTwo.Priority = ThreadPriority.Lowest;

threadOne.Start();
threadTwo.Start();
Thread.Sleep(2000);
loopSwitch = false;
}
}
}

        運行結果:

        threadTwo,優先級:Lowest數到:744795888
        threadOne,優先級:Normal數到: 745653704
        很顯然線程優先級高的threadOne數的數要多一些,也就是說它執行的快一些。
        這裡還要注意一個問題,線程的優先級還跟平台有關。不同的操作系統會對線程的調度不同,也就是說你在Windows下設的優先級到其他操作系統下可能一點用都沒有。
        建議不要隨便提高線程的優先級,如果線程優先級過高可能會影響其他線程的執行,從而導致嚴重的、難以預料的、不堪設想的後果。

作者“牆頭草的博客”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved