C#中線程的用法



通過委托的方式創建線程


 

static int sum(int x)

{

return x+x;

{

Func<int> a = sum;

創建一個新的線程格式:a.BeginInvoke(10);

獲取一個線程的返回值:IAsyncResult ar = a.BeginInvoke(10,null,null);  

  //第二種方法 IAsyncResult ar = a.BeginInvoke(10,OnCallback,a);

  //第三種方法,使用lanmba表達式,例如:

    /* IAsyncResult ar = */ a.BeginInvoke(10,ar=>

    {

      int res = a.EndInvoke(ar);

      Console.WriteLine(res);

    },null)

  第一個null參數代表回調函數,例如:

    static void OnCallback(IAsyncResult ar)

    {

      第二個null參數是回調函數傳遞的數據,例如:

      Func<int> a = ar.AsyncState as Func<int>;  // 把ar.AsyncState類型轉換為Func<int>類型的對象

    }

獲取線程返回值的狀態:ar.IsCompleted的返回值true為線程結束,false為線程還未結束。

獲取線程的執行的結果:int res = a.EndInvoke(ar);

 


用Thread創建線程

創建線程:Thread t = new Thread(Function);  // Function為需要啟動一個新的線程來執行的函數

啟動線程:t.Start();  // 如果Function有參數(必須是Object類型),則Function的參數由Start函數來傳遞

獲取線程ID:Thread.CurrentThread.ManagedThreadId

 

也可以自己寫一個類,例如:

class MyThread

{

  private string fileName;

  private string filePath;

  public MyThread(string filename,string filepath)

  {

    this.fileName = filename;

    this.filePath   = filepath;

  }

  public void DownFile(string filename,string filepath)

  {

    Console.WriteLine("正在下載:"+filepath+filename);

    ......

    Console.WriteLine("下載完成");

  }

}

在program中調用

MyThread myt = new MyThread("filename","filepath");

Thread t = new Thread(myt.Down);

t.Start();

設置后台線程的方法,例如:t.IsBackground = true;

線程分為前台線程與后台線程,后台線程會伴隨着前台線程的結束而被強制結束

強制終止一個線程:t.Abort();

優先執行的線程:t.Join();  // 暫停當前程序,先執行t.Join()然后再執行當前未執行完的線程

 

C#中的線程池

C#中已經封裝好了一個線程池ThreadPool,在雙核的條件下默認1023個工作線程,和1000個I/O線程。所有線程為后台線程

調用線程池的方法:ThreadPool.QueueUserWorkItem(Function);  // Function為自定義函數,這個函數要有一個object類型的一個參數

 像一個正在運行的線程加鎖的用法:lock(加鎖的對象);

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM