歡迎您光臨本站 註冊首頁

實例代碼講解c# 線程(上)

←手機掃碼閱讀     hongdian2012 @ 2020-06-26 , reply:0

簡介

過去普通計算機只有計算單元,卻不能同時執行多個任務。然而操作系統卻已經可以同時運行多個應用程序,即實現了多任務的概念。為了防止一個應用程序控制CPU而導致其他應用程序和操作系統本身永遠被掛起這一可能情況,操作系統不得不使用某種方式 將物理計算單元分割為一些虛擬的進程,並給予每個程序一定量的計算能力。此外,操作系統必須始終能夠優先訪問CPU,並能調整不同程序訪問CPU的優先級。線程正是這一概念的實現。可以認為線程是一個虛擬進程,用於獨立運行一個特定的程序。 (請記住線程會消耗大量的操作系統資源。多個線程共享一個物理處理器將導致操作系統忙於管理這些線程,而無法運行程序。)

接下來創建一個控制檯應用程序

  class Program     {     static void Main(string[] args)    {     Thread t = new Thread(PrintNumbers);     t.Start();     PrintNumbers();     Console.ReadKey();    }     static void PrintNumbers() {     Console.WriteLine("Starting...");     for (int i = 1; i < 10; i++)     {      Console.WriteLine(i);       }     }  }

 

結果兩組範圍為1到10的數字會隨機交叉輸出。這說明了printnumbers方法同時運行在主線程和另一個線程中。

  static void DoNothing() {     Thread.Sleep(TimeSpan.FromSeconds(2));    }    static void PrintNumbersWithStatus()    {     Console.WriteLine("Starting...");     Console.WriteLine(Thread.CurrentThread.ThreadState.ToString());     for (int i = 1; i < 10; i++) {     Thread.Sleep(TimeSpan.FromSeconds(2));     Console.WriteLine(i);     }    }

 

在main方法中加入以下代碼片段

  Console.WriteLine("Starting program...");     Thread t = new Thread(PrintNumbersWithStatus);     Thread t2 = new Thread(DoNothing);     Console.WriteLine(t.ThreadState.ToString());     t2.Start();     t.Start();     for (int i = 1; i < 30; i++) {      Console.WriteLine(t.ThreadState.ToString());     }     Thread.Sleep(TimeSpan.FromSeconds(6));     t.Abort();     Console.WriteLine("A thread has been aborted");     Console.WriteLine(t.ThreadState.ToString());     Console.WriteLine(t2.ThreadState.ToString());

 

工作原理 當主程序啟動時定義了兩個不同的線程。一個將被終止,另一個則會成功完成運行。線程狀態位於Thread對象的ThreadState屬性中。ThreadState屬性是一個C#枚舉對象。剛開始線程狀態為ThreadState.Unstarted。然後我們啟動線程,並估計在一個週期30次迭代的區間中,線程狀態會從ThreadState.Running變為ThreadState.WaitSleepJoin。 如果實際情況與以上不符,請增加迭代次數,終止第一個線程後,會看到現在該線程狀態為ThreadState.Aborted。程序也有可能會打印出ThreadState.AbortRequested狀態。這充分說明了同步兩個線程的複雜性。請記住不要在程序中使用線程終止。我在這裡使用他只是為了展示相應的線程狀態。最後可以看到第二個線程t2成功完成並且狀態為ThreadState.Stopped。另外還有一些其他的線程狀態,但是要麼已經被棄用,要麼沒有我們試驗過的幾種狀態有用。

 


[hongdian2012 ] 實例代碼講解c# 線程(上)已經有252次圍觀

http://coctec.com/docs/c/language/show-post-239779.html