2011-08-26 57 views
2

我的.NET Windows Forms應用程序中遇到了一個煩人的問題。當在.NET中顯示模式對話框時閃爍很小

我有一個MainForm(A)和一個進度表(B),當我開始長時間的操作時顯示爲模態。

當操作完成並且B關閉時,似乎應用程序後面的窗口(通常在Skype中發生)在幾毫秒內被置於前面,然後我的應用程序正常激活。

只是一個小閃爍,但煩人。在這裏,我寫一些技巧,可以幫助找到解決方案:

  • 我叫showDialog沒有IWin32Window,但我沒有成功的結果添加它。
  • 我關閉B使用Close(),然後我試圖Hide()然後Close()但沒有幫助。
  • 執行ShowDialog()的代碼是從UI線程調用的,所以它似乎不是線程問題。

任何線索將不勝感激。提前致謝。

+2

真的不明白這一點部分「在幾毫秒之內被帶到」 – crlanglois

+0

我想你說的是你關閉了模態窗體,它看起來像你的MainForm在重新出現之前消失了一會兒? – crlanglois

+0

要清楚,B關閉後會立即出現閃爍現象嗎? – NotMe

回答

0

好吧, 這聽起來像

  1. 在主窗口中用戶開始長時間操作
  2. 您顯示進度模態窗口
  3. 操作完成後關閉進度窗口
  4. 你的主要窗口不會立即顯示。相反,它背後的東西顯示一秒鐘或更少。
  5. 您的主窗口完成了重繪操作,並且100%可見。
  6. 當您運行諸如Skype的應用程序時,會更頻繁地發生這種情況。

如果是這種情況,有很多不同的可能原因。例如,您的視頻驅動程序可能有一個錯誤,導致在某些情況下出現屏幕合成延遲。

系統本身甚至可能正在經歷阻塞CPU操作。這可能是由您的代碼關閉對話框並返回主窗體所需的時間造成的。您可能會看到在進度關閉和您將UI控制返回給用戶之間是否還有其他任何操作。

該系統可能只是內存受限,您的操作會導致磁盤交換量巨大。操作完成後,可能會通知窗口它需要將先前交換的內存從磁盤中拉出並將其推回到RAM中,從而導致延遲。


我與沒有運行應用程序其他加載,但任務管理器或資源監視器,看看會發生什麼。如果問題不再發生,那就考慮增加更多的RAM給你的機器和/或忽略它。

如果仍然存在,並且您的內存使用量幾乎沒有剩餘,那麼再次添加RAM或忽略。

如果仍然發生但內存使用率較低,請調查您的代碼,以查看在關閉對話框和釋放主窗口控件返回給用戶之間所做的操作。

3

我正在經歷這些相同的症狀,這讓我瘋狂。

我終於發現問題是,我打電話給this.Dispose()而不是this.Close()關閉模式窗口我不知道爲什麼我首先打電話給this.Dispose()

切換方法後,問題就消失了。

我意識到這個線程是舊的,這不是你的問題的原因,我只是想幫助其他人犯了同樣的錯誤,我做了。

2

檢查您是否調用隱藏或關閉。避免閃爍的唯一方法是DialogResult。 UPD: this.DialogResult = DialogResult.Ok

檢查處理OnFormClosing等他們可能containt錯誤的方法調用。

的小動作是設置所有者明確

誰正在編輯的職位
_dialog.Owner = this; 
_dialog.ShowDialog(); 

人 - _dialog.ShowDialog(this)工作有點不同。 看owner = ((Control) owner).TopLevelControlInternal;由人編輯反編譯的代碼

或...

_dialog.ShowDialog(this); 

These calls are identical according to MSDN

+0

我剛剛通過評論隱藏和關閉修復了閃爍問題。 –

+0

嗨生氣,我不明白,我打電話關閉(),而不是隱藏(),但我需要調用關閉()關閉對話框,請你能更好地解釋你的答案?謝謝! –

+0

關閉對話框的好方法是this.DialogResult = DialogResult.Ok –

0
  1. 不要叫Close模態窗口(它不會被佈置和內存泄漏保證)

  2. 從設置this.DialogResult = DialogResult.OK

  3. 呼叫Dispose()父母,永遠不要從你正在關閉的表格

  4. 記住處置所有組件的形式​​持有的Dispose(bool)的(VS設計師實現的Dispose(布爾)的通常是不夠的不要有內存泄漏)

相關問題