2011-08-26 54 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(布尔)的通常是不够的不要有内存泄漏)

相关问题