2014-04-01 86 views
-1

我在winforms上的messagebox有問題。 看來,當消息框顯示主線程卡住,這導致系統中的其他錯誤。Winforms MessageBox攔截主線程

有2個系統,一個客戶端和一個服務器。客戶端有幾個線程可以更新GUI並監聽來自其他系統的事件,當顯示消息框時,這些線程無法訪問GUI,因爲消息箱使用主線程,並且會導致錯誤。

有沒有辦法讓消息框不使用主線程?

+0

'這會導致系統中出現其他錯誤。「它們是什麼?這似乎是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。所以你可以更好地說出你想解決什麼問題 –

+0

你可以,但你真的不應該這樣做。你遇到的*實際問題是什麼? – Crono

+0

有2個系統,一個客戶端和一個服務器。客戶端每隔x秒向服務器發送一個保持活動事件,如果未發送該事件,則將錯誤寫入日誌。當顯示消息框時,不會發送保持活動事件,並且每5秒鐘開始在日誌中顯示錯誤... –

回答

1

你必須扭轉你的想法。這不是MessageBox,不應該使用主線程,它確實是你的保持活動請求,不應該MessageBox不會是唯一可能阻止請求被髮送的事情:任何模式形式可能最終導致完全相同的問題。

這裏真正的解決方案是更改應用程序的設計,以便它在循環後臺線程中發送請求,而不是在主UI之間使用Thread.Sleep在調用之間以合理的時間間隔保持請求。無論有任何呼叫MessageBox.Show(),這將繼續滾動。

如果您需要以任何方式改變該線程的UI,則只需使用invocation methods即可。

+0

在與工作中的同事談論之後,似乎還有許多其他線程在工作的背景。所以問題仍然是消息框... –

+0

@LiranFridman恐怕目前還不清楚你的其他線程如何阻止你應用建議的解決方案。我認爲總是從另一個線程調用'MessageBox'是一個巨大的概念錯誤。即使它解決了你的眼前的問題,它也是一個全新的挑戰。可以在不同的線程中執行多個'MessageBox.Show()'調用,將對話用戶輸入返回到主線程會更困難,等等......我相信你會創建比解決問題更多的問題。當然,這是你的要求,但我不能鼓勵你不這樣做。 – Crono