應用框架的設計與實現——.NET平臺(8.1 Windows服務.線程)

啓動一個線程最通常的做法如下:

ThreadStart ts1 = new ThreadStart(bo.DoWork);
Thread t 
= new Thread(ts1);
t.Start();


.net中有一種隱式使用線程的方式,這種方式在上一章已經提到過了。
通過線程池可以隱式地創建線程,這些線程是受CLR控制的,我們不能直接控制。

CalculationHandler slowAddHandler = new CalculationHandler(math.SlowAdd);
IAsynResult ar 
= slowAddHandler.BeginInvoke(43nullnull);

Thread.Sleep()方法可以讓當前線程休眠一定的時間。

public void DoWork()
{
    
if (mustSleep)
    
{
        Thread.Sleep(
1000);
    }

}


Thread.Sleep(-1) 可以讓當前線程無限期的等待下去;
Thread.Sleep(0) 讓當前線程讓出一次執行機會給其他線程。
(順便說:CLR會不會把這一次機會給其它進程的線程?想來機會屬於進程的,如果進程內的其它線程不需要的話,機會還是會還給這個線程的。)

Thread.Interrupt 方法可以喚醒一個休眠的線程,但是會使休眠的線程拋出ThreadInterruptedException異常。

static void Main()
{
    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() 方法讓當前線程等待某線程的執行。

static void Main()
{
    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 方法後應該留出一些時間來給線程,用來釋放資源。

static void Main()
{
    ThreadStart ts 
= new ThreadStart(DoWork);
    Thread t 
= new Thread(t);
    t.Start();
    
// do something
    t.Abort();
    t.Join();
}


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章