1.每個窗體都有自己的都在不同的線程上運行,如果需要在窗體之間交互,就需要在線程之間交互。
2.當線程Sleep時,系統就退出執行隊列一段時間,當睡眠結束時,系統會產生一個時鐘中斷,從而
使線程回到執行隊列中,從而恢復線程的執行。
3.如果父線程先于子線程結束,那么子線程將在父線程結束的同時被迫結束。Thread.Join()方法使父線程等待,直到子線程結束。
Abort()方法帶來的后果是不可恢復的終止線程。
4.起始線程可以稱之為主線程,如果所有的前臺線程都停止了,那么主線程可以終止,而所有的后臺線程都將無條件終止。
后臺線程跟前臺線程只有一個區別,那就是后臺線程不妨礙程序的終止。一旦一個進程所有的前臺線程都終止后,CLR
將通過調用任意一個存活中的后臺進程的Abort()方法來徹底終止進程。
6.掛起,睡眠(都可稱為--阻塞,暫停)
與Thread.Sleep 不同,Thread.Suspend 不會使線程立即停止執行。直到線程到達安全點之后它才可以將該線程掛起。如果線程尚
未啟動或已經停止,則它將不能掛起。調用 Thread.Resume 將使另一個線程跳出掛起狀態并使該線程繼續執行。
一個線程不能對另一個線程調用Sleep ,但是一個線程可以對另一個線程調用Suspend。
還可以使用許多其它的方式來阻塞線程。例如,可以通過調用 Thread.Join 使一個線程等待另一個線程(子線程)停止。使用
Monitor.Wait使一個線程等待訪問一個同步對象。
5.關鍵字lock可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內只允許一個線程進入執行,而其他線程必須等待。
多線程公用一個對象時,就不應該使用lock關鍵字了,這里Monitor,Monitor提供了使線程共享資源的方案。
Monitor類可以鎖定一個對象,一個線程只有得到這把鎖才可以對該對象進行操作。
如:
Monitor.Enter(obj);
//現在oQueue對象只能被當前線程操縱了
Monitor.Exit(obj);
6.一個進程開始時至少會有一個主線程 ( 即主執行實例 ) ,這是在系統加載你的程序的時候所創建的主執行流程。
而消息隊列則是與線程 ( Thread ) 相關的,在似win2k上一個線程有一個且只有一個消息隊列 ( queue ) 與之相對應。
消息隊列是在什么時候生成的呢? 在似win2k系統上,從一開始創建線程就已經有了。
一個線程可以創建多個窗體。統發送給這些窗口的消息都統一發送到同一個 消息隊列 中,幸虧消息結構中有msg.hwnd指出該條消息與
哪一個窗口相關, DispatchMessage() 函數就是依照這個保證消息分派處理自動化而且不會出錯!
7.每個窗體都屬于創建它的線程,在一線程中直接訪或間接問其它線程中的窗體的方法將導致運行時錯誤(VS2005)。
解決方法:使用窗體從Control繼承而來的Control.Invoke(Delegate)方法。該方法將在創建窗體的線程上執行委托指向的方法。
注意:在VS2003下,可以在一個線程中直接或間接調用另一個線程中的窗體的方法,而不會導致運行時錯誤。