今天在實驗lua+wpf的時候碰到乙個問題:
我在主線程中寫的lua虛擬機器的 dofile,但當我要令lua指令碼執行阻塞的時候,同時也會阻塞ui執行緒。
於是我把對lua的介面挪到另乙個單獨的後台執行緒中,專門負責與lua指令碼的互動。
編譯一切正常,執行時throw了異常,說不能在非建立ui元素的執行緒中改變ui元素屬性。。
查了一下,c#就是這種機制,因為其gui系統底層是內部單執行緒機制,所以為了避免各種亂七八糟的錯誤,直接禁用了跨執行緒的gui元素操作。
查了一下,用了個dispatcher的叫 「begininvoke」 的方法解決本問題。
其思想也就是非同步呼叫,不過我估計是從gui元素的dispatcher上分出時間片來啟動執行緒。(沒有深研究,不過總算搞定了這個問題)
主要**如下,被注掉的部分是原來行不通的方法。
WPF 跨執行緒操作控制項
跨執行緒操作ui net2.0以來,就規定了不允許子執行緒對ui上建立的物件進行操作.在winform中,通過控制項的委託方法 control.invoke control.begininvoke 進行呼叫.而在wpf中對控制項增加了dispathcer類.dispatcher 該類的常用方法為 c...
WPF跨執行緒更新UI控制項
1.預設情況下,在windows應用程式中,net framework不允許在乙個執行緒中直接操作另乙個執行緒中的控制項。winform中實現跨執行緒操作控制項的兩種方法 1 關閉執行緒安全檢查 control.checkforillegalcrossthreadcalls false 2 使用控制...
C 跨執行緒操作控制項
在看別人 的時候總是會invoke和begininvoke方法,雖然大致明白是什麼意思,但卻不能很好的使用,上網查了很多資料,剛巧看到自己求學期間 過一篇博文 c invoke和begininvoke的區別 net平台下winform wpf禁止跨執行緒直接訪問控制項,因此在必須跨執行緒訪問控制項的...