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

C#中線程的用法,

編輯:C#入門知識

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(加鎖的對象);

 

 

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