.net框架提供很多方法來實現多執行緒程式設計。我想展示如何通過同步訪問使用者介面去執行乙個工作執行緒(例如,乙個讀取記錄集並要在乙個窗體中填充控制項的執行緒)。
執行執行緒,我用:
.net只允許control中建立的執行緒去呼叫system.windows.forms.control的函式。要想從另乙個執行緒中訪問
system.windows.forms.control中的函式,你需要使用
control.invoke(同步呼叫)或
control.begininvoke(非同步呼叫)函式。比如說顯示資料庫的記錄,我們就需要
invoke
。
要想實現這個,我們要用:
等待「執行緒已經停止」事件;
invoke呼叫是被主線程所處理的。
執行緒函式檢查每個迭代,看「停止執行緒」事件是否發生了。如果這個事件發生了,函式呼叫清理操作,觸發「執行緒已經停止」事件,並返回。
demo有兩個類:mainform和
longprocess
。
"stop thread"按鈕或關閉窗體時停止。1//
mainform.cs23
namespace
workerthread440
41//
4243
//start thread button is pressed
44private
void
btnstartthread_click(
object
sender, system.eventargs e)
4560
6162
//worker thread function.
63//
called indirectly from btnstartthread_click
64private
void
workerthreadfunction()
6572
73//
stop worker thread if it is running.
74//
called when user presses stop button or form is closed.
75private
void
stopthread()
76),
92100,93
true
) )94
979899}
100}
101}
102103
//add string to list box.
104//
called from worker thread using delegate and control.invoke
105private
void
addstring(string s)
106109
110//
set initial state of controls.
111//
called from worker thread using delegate and control.invoke
112private
void
threadfinished()
113117
118}
119}
120121
122123
namespace
workerthread
124);
146147
148//
check if thread is cancelled
149if
( m_eventstop.waitone(0,
true
) )150
159}
160161
//make synchronous call to main form
162//
to inform it that thread finished
163m_form.invoke(m_form.m_delegatethreadfinished,
null
);164
}165
166}
167}
168169
170171
172
C 中的多執行緒
多執行緒 前台執行緒 只有所有的前台執行緒都關閉才能完成程式關閉 後台執行緒 只要所有的前台執行緒結束,後台執行緒自動結束 產生乙個執行緒的4個步驟 編寫產生執行緒所要執行的方法 引用system.threaing命名空間 例項化thread類,並傳入乙個指向執行緒所要執行方法的委託。這時候這個執行...
c 多執行緒中的執行緒同步 Event
互斥量mutex 與 互斥量cs 中,執行緒的編號,也就是i是在主線程中1的,但是子執行緒裡列印出的 i 卻非常混亂,因為主線程裡的寫操作 和子執行緒裡的讀操作是同時進行的,這個有點像資料庫裡的事物,寫操作分為三個步驟,從記憶體中讀取i的值放入暫存器,第二步在暫存器裡加1,第三步寫回記憶體,而子執行...
C 執行緒呼叫主線程中的控制項
由於專案的需要,最近幾天一直在做串列埠和資料庫。由於c 使用的時間不長,所以在編寫 和除錯的過程中總是遇到意想不到的問題,比如在使用串列埠接收資料的時候,在接收資料事件中想把接收的資料放入乙個textbox作顯示,但是明明非常簡單的 在編譯的時候總是提示有錯誤。後來檢視網上資料,才知道c 還有委託,...