台灣最大程式設計社群網站
線上人數
1193
 
會員總數:246631
討論主題:190056
歡迎您免費加入會員
討論區列表 >> C# >> 關於this.Invokerequire = true 的時機
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
關於this.Invokerequire = true 的時機
價值 : 20 QP  點閱數:247 回應數:1
樓主

陳字維
門外漢
0 2
12 1
發送站內信

首次發文,還請包容
小弟最近遇到一個問題,
以下是需求動作:
程式內部有一個Thread時時抓取PLC的信號,並且當訊號觸發時,將呼叫新的視窗,視窗介面提供用戶設置數值
並且經爬文後,使用this.invoke 的方式去作跨執行緒開啟UI
當視窗彈出時,會發生異常異常如下 :
在创建窗口句柄之前,は法在控件上调用Invoke或BeginInvoke
(Invoke or BeginInvoke cannot be called on a control until the window handle has been created)
程式碼如下:



後來我使用控件觸發bool變數 來替代原本PLC的信號 卻發現可以正常開啟視窗
程式碼如下:



問題來了,如果使用前者當作信號時將不會觸發this.InvokeReqiured 導致程式開啟後報錯,但當我使用後者當作信號時this.InvokeRequired卻觸發了
有板友知道這是為什麼嗎? 並且小弟我只能在原程式碼上重現這個錯誤,找不到其他方式能重現了,如果有能重現this.InvokeRequired = false 的方式請再提供給我,不勝感激~~~

搜尋相關Tags的文章: [ Invoke ] ,
本篇文章發表於2021-04-29 10:21
1樓
回應

春天
檢舉此回應
Invoke or BeginInvoke cannot be called on a control until the window handle has been created
拋異常是因為Form還沒完全初始化就呼叫Invoke,訊息其實已經跟你說原因了
那麼什麼時候window handle才會建立? 我能確定的是在Load事件後已經建立了
所以你可以試一下以下兩個寫法,一個會出一樣的異常,一個不會





所以問題就出在你的Thread.Start之後在Form.Load之前就已經觸發事件J1RequirePalletID
而Button不會觸發,那是因為你能按Button的時候Form早已Load完畢
本篇文章回覆於2021-04-29 11:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.