2008年4月24日 星期四

Threading (Part 4)(4.24)

書刊:Application Development Foundation


其它同步的方法(p.398)
  • ReaderWriterLock
  • Mutex
  • Sempaphore
  • AutoResetEvent
  • ManualResetEvent

ReaderWriterLock(p.398)

  • 定義鎖定:單一寫入器和多重讀取器
  • 不像其它同步的方法,它可以容許同時多個執行緒進行讀取
  • 如果資源不常變更的話,此方式的效能會比 Monitor 佳
  • 使用 AcquireReaderLock 來取得讀取鎖定
  • 使用 AcquireWriterLock 來取得寫入鎖定
  • 使用 ReleaseReaderLock/ReleaseWriterLock 來解除鎖定
  • 使用 UpgradeToWriterLock 來由讀取升級為寫入鎖定
  • 使用 DowngradFromWriterLock 來由寫入還原為讀取鎖定

Mutex(p.402)

  • 和 Monitor 類似
  • 具有跨 AppDomain 的功能

Semaphore(p.405)

  • 具有跨 AppDomain 的功能
  • 可以自行限制允許的緒行緒數量(一般只能一個)

Event(p.406)

  • 具有跨 AppDomain 的功能
  • 分為「AutoResetEvent」及「ManualResetEvent」

2008年4月17日 星期四

Threading (Part 3)(4.17)

書刊:Application Development Foundation



Lession 2 : 共享資料的存取(Sharing Data)(p.387)


防止資料衝突(Avoiding Collisions)


  • 在多個執行緒同時共用同個全域變數執行時,會發生重覆存取的狀況

生活範例 :

假設在Server上有個 Word 檔,希望3個人(A,B,C)在上面簽名,

命令一發出去,3個人跑來要簽名,A 很快的取得頭籌搶先簽到名,

所以在該檔上,有了 A 的簽名,再來 B 也很快的把 Word 檔讀出去要簽名,

此時,C 也把檔案讀了出去,當 B 簽好名,把 Word 檔存了進去,

進而,C 也簽好了,把他的 Word 檔存了進去。

這時候發生了個狀況,發現,上面居然沒有 B 的簽名。

因為,B 簽名的那個檔案,被 C 的檔案蓋掉了。

這就是該本課的重點,教導如何將這些全域的資料鎖定(只有單一執行緒能讀取)



單一數值變數適用(p.390) :

  • Interlocked Static Methods
  • Add : 將兩個64位元的整數相加,並以總合取代第一個整數
  • Decrement :遞減特定變數並將其儲存
  • Exchange : 將平台特定的控制代碼或指標設定為指定值,然後傳回
  • Increment : 遞增特定變數並將其儲存
  • Read :傳回64位字的值
  • 以上皆為「不可部份完成」(鎖定)
  • 效能比較好(如果只做遞增減運算)

程式範例



區域型適用 :

  • lock(簡單型)(p.394)
  • Monitor Static Methods(進階型)(p.395)
  • Enter :取得指定物件的獨佔鎖定
  • Exit :釋出指定物件的獨佔鎖定
  • TryEnter :嘗試取得指定物件的獨佔鎖定(在指定時間內)
  • Wait :釋出物件的鎖定,並且封鎖執行緒,直到此執行緒重新取得鎖定

程式範例


Understanding Deadlocks(p.396)

  • 由於要執行的程式,被鎖定,而使程式在那
  • 可利用 Monitor.TryEnter 方法,並設定鎖定時間來解決


程式範例


2008年4月10日 星期四

Threading (Part 2)(4.10)

書刊:Application Development Foundation




















帶參數的執行緒(Passing Data to Threads)(p.377)
  • 必須使用 ParameterizedThreadStart 的物件來委派
  • 指定委派的方法,必須是個有帶 object 型態參數的方法
終止執行緒(Stopping Threads)(p.379)
  • 使用 theThread.Abort() 來執行終止執行緒( theThread 是物件名稱)
  • 適情況來使用「關鍵區域(CriticalRegion)」,防止執行緒執行不完全
  • Thread.BeginCriticalRegion() => 關鍵區域起點
  • Thread.EndCriticalRegion() => 關鍵區域終點
  • 當執行緒處於關鍵區域時,它會繼續執行直到離開關鍵區域才終止(Stop)
執行背景內容(Execution Context)(p.381)
  • 每個執行緒都有散播相關資訊給下一代的能力
  • 相反地,每個執行緒都會繼承其相關資訊
  • 優點:直接可接收相關資訊來使用
  • 缺點:繼承的過程中比較耗效能
  • ExecutionContext 類別提供「SuppressFlow」、「RestorFlow」來控制是否繼承
  • 透過 AsyncFlowControl 來移轉資料流達到關閉的效果
  • 利用 theFlow.Undo() 重新開啟散播功能( theFlow 是 AsyncFlowControl 物件名」
  • 若要在關閉散播功能後,繼續使用相關資訊,可在「前面」加入 ExecutionContext.Capture()來備份一份,之後要使用時,再利用 ExecutionContext.Run 來執行指定的內容
相關的使用方法,請參見「程式範例」


程式範例


2008年4月8日 星期二

TreeView 的 CheckBox (4.8)

在使用 TreeView 的時候,很簡單地,大家都知道,
只要將其「ShowCheckBox」的屬性設為「True」,在該節點上,
就會產生「CheckBox」型的節點。

另外發現它也有個「TreeNodeCheckChanged」的事件,
其事件的意義就是一如往常的,只要有「勾選/取消」的動作,就會觸發。
很好,那我們便很自然地去找「AutoPostBack」的屬性…

啊?居然沒有~~那也許是程式自己已經是預設「AutoPostBack=True」了吧。
於是執行程式,可是…
它居然沒有執行「TreeNodeCheckChanged」事件底下的程式???

原來,這就是很多人指出 TreeView 的 CheckBox 半殘的地方。
因為還要另外自己再加入些程式碼(JavaScript)才行。

//要加入這個,才能引發TreeView的OnTreeNodeCheckChanged事件
function doCheck()
{
//設定「o」為產生click的來源元素(物件)
var o = window.event.srcElement;

//下條件判斷:屬於checkbox的物件,才產生postback
if (o.tagName == "INPUT" && o.type == "checkbox")
{
__doPostBack("","");
}
}

並把該「TreeView」物件,加一個「onclick="doCheck()"」的事件。

2008年4月3日 星期四

Threading (part 1)(4.2)

書刊:Application Development Foundation

何謂「Threading」?(p.367)


  • 「Threading」為開發軟體裡中,甚為重要的一個觀念,主要就是能使程式正確地同時執行數個運算。也就是大家所稱的「多工」。

本章的內容,將分成三個課程。

  • Lesson 1 : Creating Threads
  • Lesson 2 : Sharing Data
  • Lesson 3 : The Asynchronous Programming Model

測試練習的方法(p.368) :

  1. 新增一個「主控台應用程式(Console application)」
  2. 在前面的部份加入參考「Using System.Threading」(C#)
Lession 1 : 產生執行緒(Creading Threads)(p.369)


介紹執行緒(Threads)

  • 執行緒重要屬性(Threads Properties) (p.369)
  • IsAlive : 指出目前的執行狀態
  • IsBackground : 是否背景執行
  • IsThreadPoolThread : 是否屬於Managed執行結果
  • ManagedThreadId : 唯一識別項
  • Name : 執行緒名稱
  • Priority : 指定或取得優先權
  • ThreadState : 目前執行緒的狀態
  • 執行緒方法(Threads Methods)(p.370)
  • Abort : 結束執行緒(無法再用Start啟動)
  • Interrupt : 插斷在WaitJoinSleep的執行
  • Join : 封鎖呼叫執行緒
  • Resume : 恢復執行緒
  • Start : 把目前的執行個體改成以thread執行(啟動執行緒)
  • Supend : 將執行緒暫停
  • 執行緒靜態屬性(Static Thread Properties)(p.370)
  • CurrentContext : 取得執行緒正在執行的內容
  • CurrentPrincipal : 角色架構安全性用
  • CurrentThread : 取得目前執行的執行緒
  • 執行緒靜態方法(Static Thread Methods)(p.371)
  • BeginCriticalRegion
  • EndCriticalRegion
  • GetDomain
  • GetDomainID
  • ResetAbort
  • Sleep : 封鎖目執行緒一段指定的時間
  • SpinWait
  • VolatileRead
  • VolatileWrite
  • 執行緒狀態列舉(ThreadState Enumeration)(p.371)
  • Aborted : 結束狀態
  • AbortRequested : 被要求結束中
  • Background : 背景執行
  • Running : 已啟動
  • Stopped : 已停止
  • StopRequested : 被要停止中
  • Suspended : 已經暫停
  • SuspendedRequested : 被要求暫停中
  • Unstarted : 未被呼叫啟用
  • WaitSleepJoin : 因為呼叫「Momtor.Wait」「Thread.Sleep」「Thread.Join」而被封鎖
  • 執行緒的優先權列舉(Thread Priority)(由最高到最低)(p.376)
  • Highest
  • AboveNormal
  • Normal
  • BelowNormal
  • Lowest


程式範例 (主要介紹「委派產生執行緒、啟動Start()、延緩Sleep()、封鎖Join()」)