方式一:通過委托發起線程(BeginInvoke):
Func<int, int> a = Test; IAsyncResult ar = a.BeginInvoke(20, OnCallBack, a);//倒數第二個參數是一個委托類型的參數,表示回調函數,當線程結束時會調用這個委托指向的方法;倒數第一個參數用來給回調函數傳遞數據;通過ar獲取數據a
方式二:通過Thread發起線程,thread創建的線程都是前台線程,線程池創建的線程都是后台線程
1. thread參數為靜態方法
static void Downloadfile() { Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); Console.WriteLine("下載完成"); } static void Main(string[] args) { Thread t = new Thread(Downloadfile); t.Start(); Console.WriteLine("main"); Console.ReadKey(); }
2. lamda表達式
1 Thread t = new Thread(() => 2 { 3 Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId); 4 Thread.Sleep(2000); 5 Console.WriteLine("下載完成"); 6 }); 7 t.Start();
3. Thread參數為普通方法

1 class Program 2 { 3 static void Downloadfile(object filename) 4 { 5 Console.WriteLine("開始下載" + filename+ Thread.CurrentThread.ManagedThreadId); 6 Thread.Sleep(2000); 7 Console.WriteLine("下載完成"+filename); 8 } 9 10 static void Main(string[] args) 11 { 12 //Thread t = new Thread(() => 13 //{ 14 15 // Console.WriteLine("開始下載" + Thread.CurrentThread.ManagedThreadId); 16 // Thread.Sleep(2000); 17 // Console.WriteLine("下載完成"); 18 //}); 19 //Thread t = new Thread(Downloadfile); 20 MyThread my = new MyThread("xxx.bt", "http://www.xxx.bbs"); 21 Thread t = new Thread(my.DownFile); 22 t.Start(); 23 Console.WriteLine("main"); 24 Console.ReadKey(); 25 } 26 }

1 class MyThread 2 { 3 private string filename; 4 private string filepath; 5 public MyThread(string fileName, string filePath) 6 { 7 this.filename = fileName; 8 this.filepath = filePath; 9 } 10 11 public void DownFile() 12 { 13 Console.WriteLine("開始下載" + filepath + filename); 14 Thread.Sleep(2000); 15 Console.WriteLine("下載完成"); 16 } 17 18 } 19 }
方式三:線程池:適合用於小任務線程,
WaitCallback:將方法排入隊列以便執行,WaitCallback,表示要執行的方法。如果將方法成功排入隊列,則為 true;否則為 false。

1 class Program 2 { 3 static void ThreadMethod(object state) 4 { 5 Console.WriteLine("線程開始"+Thread.CurrentThread.ManagedThreadId); 6 Thread.Sleep(2000); 7 Console.WriteLine("線程結束"); 8 } 9 static void Main(string[] args) 10 { 11 ThreadPool.QueueUserWorkItem(ThreadMethod); 12 ThreadPool.QueueUserWorkItem(ThreadMethod); 13 ThreadPool.QueueUserWorkItem(ThreadMethod); 14 ThreadPool.QueueUserWorkItem(ThreadMethod); 15 ThreadPool.QueueUserWorkItem(ThreadMethod); 16 Console.ReadKey(); 17 } 18 }
方式四:任務線程
1. 通過Task創建

1 class Program 2 { 3 static void ThreadMethod() 4 { 5 Console.WriteLine("任務開始" + Thread.CurrentThread.ManagedThreadId); 6 Thread.Sleep(2000); 7 Console.WriteLine("任務結束"); 8 } 9 10 static void Main(string[] args) 11 { 12 Task t = new Task(ThreadMethod); 13 t.Start(); 14 Console.WriteLine("main"); 15 Console.ReadKey(); 16 } 17 }
2. 通過TaskFactory創建
TaskFactory tf = new TaskFactory(); tf.StartNew(ThreadMethod);
tf.StartNew(ThreadMethod);
tf.StartNew(ThreadMethod);