Thread t = new Thread(ts1);
t.Start();
.net中有一種隱式使用線程的方式,這種方式在上一章已經提到過了。
通過線程池可以隱式地創建線程,這些線程是受CLR控制的,我們不能直接控制。
IAsynResult ar = slowAddHandler.BeginInvoke(4, 3, null, null);
Thread.Sleep()方法可以讓當前線程休眠一定的時間。
public void DoWork()
{
if (mustSleep)
{
Thread.Sleep(1000);
}
}
Thread.Sleep(-1) 可以讓當前線程無限期的等待下去;
Thread.Sleep(0) 讓當前線程讓出一次執行機會給其他線程。
(順便說:CLR會不會把這一次機會給其它進程的線程?想來機會屬於進程的,如果進程內的其它線程不需要的話,機會還是會還給這個線程的。)
Thread.Interrupt 方法可以喚醒一個休眠的線程,但是會使休眠的線程拋出ThreadInterruptedException異常。
{
ThreadStart ts = new ThreadStart(DoWork);
Thread t = new Thread(t);
t.Start();
// do something
t.Interrupt();
}
public void DoWork()
{
try
{
Console.WriteLine("Do some Work!");
Thread.Sleep(-1);
}
catch (ThreadInterruptedException tie)
{
Console.WriteLine("被喚醒" + tie.Message);
}
finally
{
// do something
}
}
有時主線程執行完任務後要退出系統的時候,其它線程可能還沒有執行完,如果主線程退出了就會誘發異常,而且還有可能會丟失一些數據。
這個時候我們可以用 Thread.Join() 方法讓當前線程等待某線程的執行。
{
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.Start();
t2.Start();
// do something
t1.Join(); // 主線程停在這裏等t1執行完
t2.Join(); // 主線程停在這裏等t2執行完
Console.WriteLine("兩個線程都執行完了");
}
線程執行完後,調用線程的 IsAlive 方法會得到返回值 false,說明線程已經執行完。
Join() 重載方法可以設定等待的最大時間,如果超過時間還沒有結束Join方法將返回false,說明線程還在運行並且取消阻塞繼續執行後續的語句。
我們可以調用 Abort 方法關閉線程,但是與此線程綁定的方法將拋出ThreadAbortException異常。調用 Abort 方法後應該留出一些時間來給線程,用來釋放資源。
{
ThreadStart ts = new ThreadStart(DoWork);
Thread t = new Thread(t);
t.Start();
// do something
t.Abort();
t.Join();
}