C 跨執行緒操作控制項

2022-03-17 11:03:25 字數 1644 閱讀 5610

在看別人**的時候總是會invoke和begininvoke方法,雖然大致明白是什麼意思,但卻不能很好的使用,上網查了很多資料,剛巧看到自己求學期間**過一篇博文:

c#invoke和begininvoke的區別

.net平台下winform、wpf禁止跨執行緒直接訪問控制項,因此在必須跨執行緒訪問控制項的時候採用非同步方式。

1、winform專案中跨執行緒訪問控制項:

編寫乙個winform小例項:在做winform專案中,有時為了將系統執行的狀態實時顯示到form中,因此新增乙個richtextbox控制項實時顯示系統執行日誌。本例實現的操作是將日誌以字串的形式寫入richtextbox控制項,因為是實時顯示,所以涉及到跨執行緒輸入的問題。

private

delegate

void setrichtexbox(string

s);

public

void settext(string

txt));}

else

}private

void set(string

txt)

控制項的invokerequired的值為true時,說明有乙個不屬於建立它的執行緒要訪問它,此時需要採用非同步的方式進行操作。

2、wpf專案中跨執行緒訪問控制項:

wpf的page頁中,加入乙個button控制項和textbox控制項,點選button實現新增textbox控制項中的內容。

private

void button2_click(object

sender, routedeventargs e)

private

delegate

void writedelegate(string

str);

private

void writemethod(string

str)

3、wpf專案中跨執行緒獲取textbox控制項中的內容

本例項實現的功能是:點選button控制項,開啟socket監聽服務。監聽的埠需要從ui介面中的textbox中獲取,因為不是建立它的執行緒訪問它,因此才有dispatcher.invoke非同步操作。稍作補充:在開啟監聽的過程中,有while(true)死迴圈,將其直接放入到主線程都會導致執行緒無法正常進行下去,解決方法是開啟乙個新的執行緒來開啟監聽。

private

void button1_click(object

sender, routedeventargs e)

public

void

startserver()

private

delegate

string

gettexthandle(control control);

private

string

gettext(control control)

else

else

}}

總結:由上述幾個例項可以看到跨執行緒呼叫需要使用invoke和begininvoke(暫時沒有用到),在一些要求並不是很嚴格的系統中,暫且認為二者是可以通用的。(不知道對不?望高手指點一二)

目前為止,所接觸到的常見問題只有這些,以後遇到再補充吧。

C 中跨執行緒操作控制項

本文將分別對上述兩種情況的跨執行緒操作控制項方法進行闡述。backgroundworker 是個很好的夥計,因為它可以忙你搞定許多髒活累活。具體的講,它可以自動的幫你建立工作執行緒,可以在工作時把工作的進展情況告訴給你,可以在工作完成時通知並幫你做一些收尾的工作,當你覺得他很煩的時候,你還可以隨時讓...

C 實現跨執行緒操作控制項方法

由於在.net平台下winform wpf禁止跨執行緒直接訪問控制項,因此在必須跨執行緒訪問控制項的時候採用非同步方式。1 winform專案中跨執行緒訪問控制項 編寫乙個winform小例項 在做winform專案中,有時為了將系統執行的狀態實時顯示到form中,因此新增乙個richtextbox...

WPF 跨執行緒操作控制項

跨執行緒操作ui net2.0以來,就規定了不允許子執行緒對ui上建立的物件進行操作.在winform中,通過控制項的委託方法 control.invoke control.begininvoke 進行呼叫.而在wpf中對控制項增加了dispathcer類.dispatcher 該類的常用方法為 c...