我有一個應用程序,監視來自外部插座/以太網連接,稱爲PLC設備的位狀態。C#WPF多線程與實時PLC
這些狀態觸發數據庫調用和UI更新,其中一些需要Modal對話框,其他需要Modeless對話框。
問題在於即使顯示模態對話框,過程也需要持續監視。
我試過使用DispatcherTimer,但是這會在顯示模態對話框時阻塞。我明白爲什麼。
我試過了一個標準的Timer,但是我得到了一個異常,指出'某些UI組件需要線程在STA模式下運行'。
因此,我創建一個標準的線程並將ApartmetState設置爲STA。在需要UI交互的處理循環的一部分周圍添加DispatcherInvoke後,線程運行得很好,但是無論何時顯示模式對話框,該線程都會被阻塞,直到模式對話框關閉。
現在我真的不想進入線程間消息傳遞和過分複雜的整個事情。
我也嘗試將模態對話框放入其自己的線程中,只要需要模態對話框。一切工作正常,它幾乎可以接受,但應用程序的所有者窗口仍然可以訪問,實質上使模態對話框成爲無模式對話框。我試圖在所有者窗口上設置IsEnabled標誌,起初我認爲這樣會很好,但點擊後隱藏對話框仍然有效。
有什麼建議嗎?
將您的評論整合到問題文章中。 – Tsyvarev
因此,它最簡單的線程間消息傳遞,如ConcurrentQueue,還不夠? –
AgentFire
調度計時器不應受模態對話框的影響。當你調用ShowDialog時,你的調用堆棧被保留,但是一個嵌套的調度器循環執行直到ShowDialog返回。這就是爲什麼你可以繼續處理佈局和輸入事件等等。計時器應該被包含在其他事物中,除非明確地爲他們劃分了一個例外,這會讓我感到驚訝。但是,如果在定時器callback_中顯示模式對話框_s,那麼會阻止它啓動,因爲回調不可重入。 –