2017-09-14 89 views
0

我有一個應用程序,監視來自外部插座/以太網連接,稱爲PLC設備的位狀態。C#WPF多線程與實時PLC

這些狀態觸發數據庫調用和UI更新,其中一些需要Modal對話框,其他需要Modeless對話框。

問題在於即使顯示模態對話框,過程也需要持續監視。

我試過使用DispatcherTimer,但是這會在顯示模態對話框時阻塞。我明白爲什麼。

我試過了一個標準的Timer,但是我得到了一個異常,指出'某些UI組件需要線程在STA模式下運行'。

因此,我創建一個標準的線程並將ApartmetState設置爲STA。在需要UI交互的處理循環的一部分周圍添加DispatcherInvoke後,線程運行得很好,但是無論何時顯示模式對話框,該線程都會被阻塞,直到模式對話框關閉。

現在我真的不想進入線程間消息傳遞和過分複雜的整個事情。

我也嘗試將模態對話框放入其自己的線程中,只要需要模態對話框。一切工作正常,它幾乎可以接受,但應用程序的所有者窗口仍然可以訪問,實質上使模態對話框成爲無模式對話框。我試圖在所有者窗口上設置IsEnabled標誌,起初我認爲這樣會很好,但點擊後隱藏對話框仍然有效。

有什麼建議嗎?

+2

將您的評論整合到問題文章中。 – Tsyvarev

+0

因此,它最簡單的線程間消息傳遞,如ConcurrentQueue ,還不夠? – AgentFire

+0

調度計時器不應受模態對話框的影響。當你調用ShowDialog時,你的調用堆棧被保留,但是一個嵌套的調度器循環執行直到ShowDialog返回。這就是爲什麼你可以繼續處理佈局和輸入事件等等。計時器應該被包含在其他事物中,除非明確地爲他們劃分了一個例外,這會讓我感到驚訝。但是,如果在定時器callback_中顯示模式對話框_s,那麼會阻止它啓動,因爲回調不可重入。 –

回答

1

我已經解決了這個問題!我恢復了一個標準的定時器,並能夠避開不需要STA模式;這調動了Dispatcher.Invoke的另一個司法位置。

現在一切都如我所料。

+0

請注意阻塞'Dispatcher.Invoke'方法。你可以輕鬆地設置自己的僵局。你也可以結束一個_very_深層調用堆棧。 'BeginInvoke'往往更安全。 –