好記性不如爛筆頭,方便以后忘記了來這里看看,還有什么沒有提到的大家可以告訴我,幫忙完善,謝謝!~ Donate?[1]
準備工作
創建一個控制臺程序
并在Program.cs文件中加入以下using指令:
using System;
using System.Threading;
using System.Console;
1.1.1 創建線程
先定義一個方法
static void Test()
{
Console.WriteLine("Starting...");
for (int i = 1; i < 100; i++)
{
Console.WriteLine(i);
}
}
Main方法中加入以下代碼片段
Thread t = new Thread(Test);
t.Start();
這樣就完成了一個線程的創建.
1.1.2 暫停線程
只需要在線程調用的方法中調用Thread.Sleep方法就可以讓線程暫停
static void Test()
{
Console.WriteLine("Starting...");
for (int i = 1; i < 100; i++)
{
Console.WriteLine(i);
Thread.Sleep(TimeSpan.FromSeconds(2)); //這樣就讓線程暫停了兩秒鐘
}
}
1.1.3 等待線程
只需要在線程開始后調用t.Join方法就可以讓主程序等待直到t線程完成
Thread t = new Thread(Test);
t.Start();
t.Join();
//如果不想一直等待,也可以給它加參數
//如: t.Join(TimeSpan.FromSeconds(2));等待兩秒后主線程繼續運行
1.1.4 終止線程
只需要在需要終止線程的地方調用t.Abort就可以了,但這非常危險,因為t.Abort方法是給t線程注入了ThreadAbortException方法,導致線程被終結的,該異常可以在任何時刻發生并可能徹底摧毀應用程序.另外,使用該方法也不一定總能終止線程.目標線程可以通過處理該異常并調用Thread.ResetAbort方法來拒絕終止.因此并不推薦使用Abort方法來關閉線程.可優先使用一些其他方法,比如提供一個CancellationToken方法來取消線程的執行.
Thread t = new Thread(Test);
t.Start();
Thread.Sleep(TimeSpan.FromSeconds(5));
t.Abort(); //線程開始5秒后終止線程
1.1.5 檢測線程狀態
可以用t.ThreadState方法來獲取線程當前的狀態,如是否已經啟動或是否處于阻塞等狀態信息.由于線程是獨立運行的,其狀態可以在任何時候被改變,所以獲取線程的當前狀態是非常有用的.
Thread t = new Thread(Test);
t.Start();
Console.WriteLine(t.ThreadState);
//打印t線程當前的狀態
1.1.6 線程優先級
可以使用t.Priority來設置線程的優先級,線程優先級決定了該線程可占用多少CPU時間.
Thread t = new Thread(Test);
t.Priority = ThreadPriority.Highest;
t.Start();
1.1.7 前臺線程和后臺線程
用t.IsBackground設置線程為前臺線程和后臺線程.
1.前臺線程和后臺線程的主要區別:進程會等待所有的前臺線程完成后再結束工作,但如果只剩下后臺線程,則會直接結束工作.
2.注意事項:如果程序定義了一個不會完成的前臺線程,主程序并不會正常結束.
Thread t = new Thread(Test);
t.IsBackground = true;
t.Start();
1.1.8 向線程傳遞參數
使用t.Start傳遞數據,為了應用該方法,在線程中啟動的方法必須接受object類型的單個參數.
static void Test(object obj)
{
int count = (int) arg;
Console.WriteLine("Starting...");
for (int i = 1; i < count; i++)
{
Console.WriteLine(i);
Thread.Sleep(TimeSpan.FromSeconds(2));
}
}
Thread t = new Thread(Test);
t.Start(8);
使用lambda表達式傳遞參數.
static void Test(int i)
{
Console.WriteLine(i);
}
Thread t = new Thread(()=> Test(1));
t.Start();
這可能會導致幾個問題.例如在多個lambda表達式中使用相同的變量,他們會共享該變量值.例如下面這個例子,t1和t2都會打印出20,因為在這兩個線程啟動之前變量被修改為20.
int i = 10;
Thread t1 = new Thread(()=> Test(i));
i = 20;
Thread t2 = new Thread(()=> Test(i));
t1.Start();
t2.Start();
=>1.2線程基礎(二)
-
贊賞支持 ?