多執行緒中使用Invoke函式防止資源訪問衝突

2021-06-04 00:59:55 字數 1161 閱讀 3872

剛學c#,用部落格的形式把自己的學習心得記錄下來,這是我的第一篇文章,哈哈,如果有什麼問題,可以指出。    

前段時間寫了乙個串列埠收發的c#窗體應用程式,因為串列埠收發是在後台執行的,所以開了乙個執行緒專門用於收發,建立執行緒的語句如下:

private thread mworkthread;

mworkthread = new thread(new threadstart(threadcalc));

mworkthread.isbackground = true;

mworkthread.start();

threadcalc函式是後台的執行函式,如下:

private void threadcalc()

........... 

if(bneedrefresh)

this.invoke(new delegaterefresh(refreshled));

thread.sleep(10) ;// (1000);

}}

delegateled和delegaterefresh是在類中宣告的委託,如下:
public delegate void delegateled(bool bset);

public delegate void delegaterefresh();

其中的函式setorresetled和refreshled就是需要訪問顯示執行緒中建立的控制項的函式,如下:
private void setorresetled(bool bset)

private void refreshled()

如果不使用invoke方法而直接把button1.text=「reset「寫入執行緒threadcalc中,則通常會導致不可預知的結果。如果出現編譯通不過的情況,可以設定變數checkforillegalcrossthreadcalls=false。

我理解的是invoke就像是vc++中的sendmessage。

c 多執行緒 Invoke方法的使用

在多執行緒程式設計中,我們經常要在工作執行緒中去更新介面顯示,而在多執行緒中直接呼叫介面控制項的方法是錯誤的做法,invoke 和 begininvoke 就是為了解決這個問題而出現的,使你在多執行緒中安全的更新介面顯示。正確的做法是將工作執行緒中涉及更新介面的 封裝為乙個方法,通過 invoke ...

c 多執行緒 Invoke方法的使用

在多執行緒程式設計中,我們經常要在工作執行緒中去更新介面顯示,而在多執行緒中直接呼叫介面控制項的方法是錯誤的做法,invoke 和 begininvoke 就是為了解決這個問題而出現的,使你在多執行緒中安全的更新介面顯示。正確的做法是將工作執行緒中涉及更新介面的 封裝為乙個方法,通過 invoke ...

c 多執行緒 Invoke方法的使用

在多執行緒程式設計中,我們經常要在工作執行緒中去更新介面顯示,而在多執行緒中直接呼叫介面控制項的方法是錯誤的做法,invoke 和 begininvoke 就是為了解決這個問題而出現的,使你在多執行緒中安全的更新介面顯示。正確的做法是將工作執行緒中涉及更新介面的 封裝為乙個方法,通過 invoke ...