我的應用程序的一個要求是,如果它失去了數據庫連接,那麼它必須彈出一個大模式「無連接,稍後再試」對話框阻止所有的用戶交互,直到重新獲得連接。如何阻止UI線程從另一個線程或強制一個窗體在UI線程內運行
我通過在應用程序啓動時啓動DeviceMonitor類的一個實例來實現此目的。這個類創建一個System.Threading.Timer和每個Tick(通常1秒)以及其他一些嘗試從數據庫中繪製數據的東西。如果繪製失敗並且確定原因是由於缺少連接,則通過彈出上述對話框來處理異常。同樣,如果數據獲取成功並且對話框正在啓動,它將被強制關閉。
問題是,儘管這一切都正常,但ConnectionLost對話框不會阻止用戶與UI進行交互。這是有道理的,因爲Timer.Elapsed事件在其自己的線程中引發,並且noConnectionDialog.ShowDialog()從回調中調用,它會阻塞它所在的線程,但不會阻塞UI線程。
據我的理解,我需要強制noConnectionDialog.ShowDialog()在UI線程中運行或阻止UI線程,直到noConnectionDialog.Hide()被調用,但我不知道該怎麼做。
也許有一些其他的補救措施,或者我在這裏失去了一些東西。任何建議表示讚賞。
編輯:更多信息 - 這是一個風格化的對話框,而不僅僅是一個消息框。當我的應用程序由Castle Windsor啓動並注入到DialogFactory類中時,它會被創建。在UI界面上的按鈕被點擊時的例子 - - 因此,對話由
var d = _dialogFactory.GetNoConnectionDialog();
d.ShowDialog();
我有把這個代碼計時器經過回調外嘗試訪問並阻止UI就好從那裏,所以這是而不是表單創建的地方。
但是,這不是一個消息框。或者說它是一個程式化的消息框,所以它必須是一個完整的表單。我確實有一個包裝對話框的裝飾器,如果需要的話調用Invoke(),所以我認爲它會在UI線程上運行,但顯然它不是。 – 2008-12-16 20:32:09