熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#線程從陌生到熟悉:突飛猛進

2022-06-13   來源: .NET編程 
    談到線程(Thread)大家應該不會陌生和他相近的還有一個進程的概念(Process)那首先我們先來熟悉他們的概念以及他們之間的關系

  什麼是進程?

  當一個程序開始運行時它就是一個進程進程包括運行中的程序和程序所使用到的內存和系統資源

  而一個進程又是由多個線程所組成的

  什麼是線程?

  線程是程序中的一個執行流每個線程都有自己的專有寄存器(棧指針程序計數器等)但代碼區是共享的即不同的線程可以執行同樣的函數

  他們的關系?

  線程跟進程既有聯系又有區別進程是代碼在數據集的一次執行是系統資源分配的基本單位任何一個線程必然在一個進程中運行;而一個進程至少擁有一個線程否則無法執行事實上每個進程都有一個主線程該線程所擁有的其他線程都是由主線程創建的如果我們s結束一個進程的主線程就會結束該進程的所有其他線程也就結束整個進程!

  我們可以這麼理解真正去運行代碼是線程!而進程只是為運行代碼配置所運行的系統資源幾個線程共同運行完成某項功能組織了一次代碼執行過程!這樣就有了進程!

  C#裡面是Thread類來表示線程的!那我們先來看看Thread類的定義



 [ComVisibleAttribute(true)]

  [ClassInterfaceAttribute(ClassInterfaceTypeNone)]

  public sealed class Thread : CriticalFinalizerObject

  _Thread

  {

  

  }

  [ComVisibleAttribute(true)]這個表示控制程序集中個別托管類型成員或所有類型對 COM 的可訪問性

  [ClassInterfaceAttribute(ClassInterfaceTypeNone)]為公開給 COM 的類指定要生成的類接口的類型(如果有接口生成)

  在從 CriticalFinalizerObject 類派生的類中公共語言運行庫 (CLR) 保證所有關鍵終止代碼都有機會執行即使是在 CLR 強行卸載應用程序域或中止線程的情況中(只要終結器遵守 CER 的規則);

  _Thread此接口用於從非托管代碼訪問托管類不應從托管代碼調用

  這裡注意的Thread類是聲明sealed他是無法被繼承的!這和Java的區別挺大的!

  他有個構造函數我們主要看下其中兩個就行了!



 [SecuritySafeCritical]

  public Thread(ParameterizedThreadStart start);

  [SecuritySafeCritical]

  public Thread(ThreadStart start);

  ParameterizedThreadStart 和ThreadStart都為一個委托其中第一個委托表示帶參數的委托類型為obj後面一個為不帶參數的委托他們都被標記了[ComVisible(false)]表示不能對COM+進行訪問!

  通過Thread的一些靜態屬性能夠得到當前的上下文當前運行的進程等等!通過他的靜態方法能獲得他的運行應用域等等!

  下面我們看個例子



  class Program

   {

   static void Main(string[] args)

   {

   ThreadStart tspx = new ThreadStart(PrintX);

   ThreadStart tspy = new ThreadStart(PrintY);

   ParameterizedThreadStart ptsp = new ParameterizedThreadStart(PrintParam);

   Thread t = new Thread(tspx);

   Thread t = new Thread(tspy);

   Thread t = new Thread(ptsp);

  

   tStart();

   tStart();

   tStart();

   ThreadSleep();

  

   }

   public static void PrintX()

   {

   int i = ;

   while (i++<)

   {

   ConsoleWrite(X);

   }

   }

   public static void PrintY()

   {

   int i = ;

   while (i++ < )

   {

   ConsoleWrite(Y);

   }

   }

   public static void PrintParam(object s)

   {

   int i = ;

   while (i++ < )

   {

   ConsoleWrite(sToString());

   }

   }

  

   }

  


  例子是比較簡單運行之後的結果往往比較隨機的!只需要把運行的次數調高點就可!注意ParameterizedThreadStart這個參數是Object類型的!從這個例子可看出這些線程是雜亂的運行的!只要將主線程結束整個應用程序就會結束而結束其他線程則不會!

  請看下面的例子



   using System;

   using SystemCollectionsGeneric;

   using SystemLinq;

   using SystemText;

   using SystemThreading;

  

   namespace ConsoleApplication

   {

   class Program

   {

   static void Main(string[] args)

   {

   Thread t = new Thread(PrintX);

   tStart();

   ThreadCurrentThreadName = Main;


   ConsoleWriteLine(主線程的應用域{}ID為{} ThreadGetDomain()ToString() ThreadGetDomainID());

   ConsoleWriteLine(主線程的名字為{}HashCode為{} ThreadCurrentThreadName ThreadCurrentThreadGetHashCode());

  

   }

   static void PrintX ()

   {

   ThreadCurrentThreadName = t;

   ConsoleWriteLine(t線程的應用域{}ID為{} ThreadGetDomain()ToString() ThreadGetDomainID());

   ConsoleWriteLine(t線程的名字為{}HashCode為{} ThreadCurrentThreadName ThreadCurrentThreadGetHashCode());

   }

   }

   }

  這個例子運行如下圖所示

  

  這裡通Thread的一些靜態屬性可以獲得我們一些想要的東西!這一點在平時用的也比較多!

  好了今天就寫了這麼多了!


From:http://tw.wingwit.com/Article/program/net/201311/11998.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.