首先來看看如何創建線程:
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
Thread t1 = new Thread(() =>
{
Thread.Sleep(1000);
Thread t = Thread.CurrentThread;
Console.WriteLine("Name: " + t.Name);
Console.WriteLine("ManagedThreadId: " + t.ManagedThreadId);
Console.WriteLine("State: " + t.ThreadState);
Console.WriteLine("Priority: " + t.Priority);
Console.WriteLine("IsBackground: " + t.IsBackground);
Console.WriteLine("IsThreadPoolThread: " + t.IsThreadPoolThread);
})
{
Name = "Thread1",
Priority = ThreadPriority.Highest
};
t1.Start();
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
我們在Thread的構造方法中傳入一個Lambda表達式,對應ThreadStart委托(無參void返回值的方法) 來構造一個線程任務。這段程序中有幾個注意點:
1)從輸出結果中可以看到,當前程序啟動後就3三個線程,新開線程後顯示為4個線程,在線程方法中 休眠了一秒,防止主線程執行完次線程就過早結束了。
2)我們可以為線程設置一個名字,方便調試。我們也可以設置線程的優先級,這個在之後會有進一步 介紹。
3)第7行,托管線程的唯一標識符,微軟建議使用托管線程的Id而不是操作系統中線程的Id來跟蹤線 程。
4)第10行代碼輸出了當前線程不是後台線程,也就是是前台線程,這是默認值。進程會等待前台線程 結束結束,而如果是後台線程的話,所有前台線程結束後後台線程自動終止。對於Windows GUI應用程序 來說,使用後台線程很可能發生詭異現象,也就是在程序從任務管理器的應用程序一欄中消失後其進程還 在,只能通過手動終止進程來釋放內存。
5)第11行代碼表明這個線程不是由線程池創建的,有關線程池見後文的介紹。
那麼我們再來看看如何為線程傳入參數,一種方式是使用匹配ParameterizedThreadStart委托 (object參數void返回值)的方法:
new Thread((date) => Console.WriteLine(((DateTime)date).ToString())).Start (DateTime.Now);