通過委托的方式創建線程
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(加鎖的對象);