線程處理概念:
線程:線程(thread),有時被稱為輕量級進程(Lightweight Process,LWP),是程式執行流的最小單元。一個標準的線程由線程ID,當前指令指標(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和指派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共用進程所擁有的全部資源。一個線程可以建立和撤消另一個線程,同一進程中的多個線程之間可以並發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。
線程是程式中一個單一的順序控制流程程。在單個程式中同時運行多個線程完成不同的工作,稱為多線程。
線程作業中的收穫:
一、事件
- 事件的定義和使用:
a.發布事件類別:首先定義一個委託,再次定義一個事件
例如:public void delegate RunHandel(eventags e)
Pulic event RunHandel runHandelEvent
事件觸發程式中:
If(runHandelEvent!=null)
{
RunHandelEvent(參數);
}
b.事件訂閱類: 執行個體化一個事件發行者類
class a=new class();
- RunHandelEvent+=new a. runHandel(事件處理方法);
- 事件觸發程式:
- run();就ok
- 事件可以自訂事件參數,傳遞值
事件的用處:
- 可以用來傳遞值。
- 動態添加方法,在合適的地方觸發該方法。
- 利用事件進行線程同步,如作業中所述。
- 一個事件可以由多個使用者訂閱,發行者決定什麼時候觸發事件,訂閱者決定怎麼處理事件。
- 還可以利用線程進行非同步委託調用。
二、線程:
1.線程:任何線程都會有一個主線程。
2.線程時程式中的一個執行流,意味著不同的線程可以執行同一個函數。
3.線程重要的方法:
4.IsBackGround是否為後台線程,後台線程主線程完了後,不會讓線程繼續運行。
方法 |
操作 |
Start |
使線程開始運行。 |
Sleep |
使線程暫停指定的一段時間。 |
Suspend |
線上程到達安全點時,使其暫停。 |
Abort |
線上程到達安全點時,使其停止。 |
Resume |
重新啟動掛起的線程 |
Join |
使當前線程一直等到另一線程完成。 在與逾時值一起使用時,如果該線程在分配的時間內完成,此方法將返回 True。 |
- 線程式控制制,保持資料的一致性:
Lock鎖機制:
Lock(expression)
this:代表一個類的執行個體(保護簡單的執行個體)
類名:保護靜態變數。
Monitor類鎖定一個對象:提供線程共用資源的方案。
典型的生產者和消費者問題:
在同一個類中有兩個不同的方法,針對的是操作同一變數,為類保持資料的一致性,我們使用monitor類來同步兩個線程和通訊。
Monitor.Waite()是當前線程進入等待狀態。
Monitor.pulse():通知另一線程進入。
Monitor.Enter():Enter
方法允許一個且僅一個線程繼續執行後面的語句;
- 線程池:是一種多執行緒形式,處理過程中將任務添加到隊列,然後在建立線程後自動啟動這些任務
- 線程池的一個優點是可以通過一個狀態物件將參數傳遞到任務過程
兩個重要的訊號類:
ManulResetEvent:一個訊號類,使用set方法通知主線程事件完成
AutoRestEvent:也是訊號類,通知主線程事件完成
WaiHandle.waitAll(訊號類數組)等待所有的的線程完成後啟用主線程。
ThreadPool.QueueUserWorkItem(new
waitCallBack(委託方法),new object資訊類)。
在處理方法中這個參數也必須是object類型。
子線程處理類中的訊號類,需要與主線程的訊號使用的是同一訊號類的引用。