簡體   English   中英

Application.DoEvents永不退出

[英]Application.DoEvents Never Exits

我正在處理一個遺留有Application.DoEvents的遺留應用程序。 我完全意識到,由於重新進入問題,人們對此一無所知,但目前無法選擇重構。

DoEvents永不退出的問題已經開始出現。 UI是響應式的(我可以在用戶日志中看到UI線程的活動),因此DoEvents似乎正在發送消息,但是由於某種原因它從未完成。 不幸的是,該DoEvents位於主數據處理組件中,這意味着由於它停留在DoEvents行上,因此這將停止處理服務器響應。

我們有Stopwatch跟蹤,它可以告訴DoEvent運行了多長時間-令人驚訝的是,我收到一條日志,上面說它運行了188267770毫秒,即52個小時(吞沒)。 它似乎在星期六大約凌晨3點進入此狀態,直到用戶星期一進入並關閉應用程序(沒有終止進程,我可以看到GUI線程跟蹤正常關閉了事情),此時DoEvents完成並且記錄了計時器數據(因此在關閉過程中發生的事情必須說服DoEvents完成)。

當然,這只會在生產用戶的計算機上發生,而不會在我的開發箱中發生:)

有人見過類似的問題嗎?

我已經對DoEvents進行了反編譯,還對Conrol.BeginInvoke如何使用Windows消息隊列將方法委托推入GUI線程進行了反編譯,但是我看不到DoEvents會像這樣卡住並保持UI響應。

源代碼控制差異也不是一個選擇,因為自從用戶擁有上一個“好”版本以來,已經有大約30個版本,而且這個新版本有問題-因此大約200個文件已更改。

非常感謝保羅

為了使循環保持運行,消息隊列中必須有消息。 因此,我假設存在一條消息,該消息在分發時會導致另一條消息被放入隊列中。 永遠如此。

您是否進行任何導致此類行為的后台處理? 發布其他消息以繼續處理? 系統中是否有可能發生的事件,在處理后可能會立即再次發生?

另一種選擇是,其中一條消息本身就是創建嵌套的消息循環。 例如,顯示對話框將導致嵌套的消息循環,直到刪除對話框后該循環才結束。 您的應用是否嘗試顯示一個對話框,然后由於某種原因該對話框不會被關閉?

給定可能性,我們無法告訴您答案。

經過大量的挖掘,我終於找到了原因-System.Windows.Forms.Timer。

基本上,兩個或多個Timer可能導致DoEvents()調用永不結束。 在處理一個計時器WM_TIMER消息的同時,另一個計時器可以發布其WM_TIMER消息,然后由DoEvents處理該消息,因為正在處理的第一個計時器將發布,依此類推。

到目前為止,我正在使用的應用具有大約8個計時器。

但是實際上,DoEvents是真正的罪魁禍首,因此我計划進行重構以消除它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM