2011-12-11 24 views
2

我有一個漫長的過程,我不能異步運行,所以就像複製文件時的資源管理器一樣,我有一個進度對話框。我以模態方式顯示對話框,然後執行操作(我們將其稱爲複製文件以使其保持抽象),更新進度對話框,並使用Application.DoEvents()抽取消息以保持應用程序主框架繪畫和響應。當模態進度對話框啓動時,可以調用「Application.DoEvents」嗎?

由於對話框是模態的,用戶除了觀看或取消之外無法進行其他操作。換句話說,他們不能選擇一個菜單項或點擊任何按鈕。

我一直認爲Application.DoEvents是非常邪惡的,因爲你可以重新輸入你不打算重入的代碼。但在這種情況下,由於進度對話框是模態的,所以我看不出這是一個糟糕或危險的解決方案。

我可以忽略一些事情,或者正在使用Application.DoEvents來抽取消息來處理模態對話嗎?

+1

爲什麼你不能在後臺線程中運行它?只需使用Background worker,並使用Control.BeginInvoke更新UI。 – BFree

+1

[Some](http://stackoverflow.com/a/5183623/825024)[閱讀](http://stackoverflow.com/a/1115410/825024)。 – Otiel

回答

0

我沒有看到DoEvents的這種有限使用的特定問題。當後臺處理不是一個選項時,我們在非常有限的情況下成功使用它。

0

正常情況下,應用程序中的UI線程會抽取消息。現在,即使模態對話框運行自己的消息泵,但這僅僅是保持呼叫行爲與預期一致(例如,只有在模式對話框關閉時纔會返回該呼叫),但不必處理模態對話框本身。 (也可參見「新舊事物」博客中的this blog post)。

因此它是不是真的叫Application.DoEvents()要麼有問題,即使它通常顯示一個設計問題(如非合作處理在UI線程),它可能事業重入如果一些窗口消息和事件處理程序正在觸發對方 - 但這與對話模式無關。

相關問題