【问题标题】:Form not closing after calling Form.Close调用 Form.Close 后表单未关闭
【发布时间】:2016-01-11 08:34:31
【问题描述】:

我们有一个在客户端运行的应用程序显示奇怪的行为。在一天中的随机时间,某些表单上的确定按钮(调用 Form.Close 方法)不会导致表单关闭。我的意思是用户将单击该按钮,在跟踪中它将显示调用了 Form.Close 但表单不会关闭。

奇怪的是,表单本身仍然是响应式的,因此他们可以单击表单上的任何按钮,并且按钮后面的代码将执行,但表单不会关闭。

这种状态会持续几秒到几分钟。然后突然表格将开始处理并消失。真奇怪。

所以回顾一下,会发生以下情况:

  • Form.ShowDialog() -> 表单显示
  • 用户在表单上工作并按下按钮等
  • Form.Close() 被调用 -> 用户点击了关闭按钮
  • 经过一段时间后,表单仍处于响应状态,只是等待关闭(此时,沮丧的用户敲击了几次关闭按钮,但没有任何响应)
  • 突然表单处理并从Form.ShowDialog返回一个对话结果

注意事项:

  • 我没有使用任何类型的线程。
  • 在某些时候报告explorer.exe 进程已在PC 上停止,这会对表单的行为产生影响吗?我们正在计划重建 PC。

我的问题是,是否有人知道可能导致上述行为的场景?

我不是表单专家,但据我了解,当您调用 Form.Close 时,表单不会立即关闭,当前调用 Close 的方法首先完成,然后另一个进程触发表单开始关闭并处置。

这可能与explorer.exe 进程未运行有关吗?

任何见解将不胜感激。

*** 编辑

另请注意,我们无法复制该问题,它在客户端随机发生。

【问题讨论】:

  • this 可能适合你吗?
  • @SimonKarlsson 我查看了您的链接,但情况不同。 Close 方法在其自身显示的模态表单上调用,因此问题不在于阻塞调用。另请注意,我们无法复制该问题,它是随机发生的。
  • 如果没有重现,我怀疑任何人都能够帮助您解决它。因此,我建议您将精力投入到创建复制品中。识别可能发生的机器和似乎永远不会发生的机器之间的差异。然后,尝试确定哪些差异是重要的。例如。操作系统版本,其他软件也在运行,32 位与 64 位,但更多。
  • @Damien_The_Unbeliever 我怀疑你是对的。我有一种感觉,它与导致此问题的环境本身的问题(如 exporer.exe 进程崩溃)有关。我希望其他人遇到这个问题并且可以确认这是一个环境问题。

标签: c# forms


【解决方案1】:

也许你可以在关闭之前先hide表单,这样用户就不会焦躁并尝试关闭它

Form.Hide();
Form.Close();

另一个原因是窗口关闭或析构函数可能是您试图保存更大的文件或某些活动。如果是这样,请尝试在线程中执行此操作。这样它就会很快关闭表格。

【讨论】:

  • 感谢您的建议。我们考虑过隐藏表格,但这只会把问题扫到地毯下,而不是解决它。它也可能导致内存问题,因为可能有多个表单隐藏在后台,所以我们宁愿确保在继续之前处理表单。此外,如果某个进程在后台忙,则表单仍不会响应。
【解决方案2】:

让我想起了C# Why does form.Close() not close the form?

在 this.Close() 行之后的按钮单击事件处理程序中是否有任何代码?

我的意思:

private void OKButton_Click(object sender, EventArgs e)
{
    this.Close();

    somecodehere <-- is there any code here? (after this.Close)
}

因为 Form.Close 不会立即关闭表单,所以如果您在调用后有代码,它仍然会执行,也许这就是阻止表单关闭的原因。

【讨论】:

  • 感谢您的建议。在 this.Close 之后执行了一些代码,但我们已经输入了跟踪日志以确认该方法完成并退出。此外,如果在 this.Close 之后仍有一些代码在执行,表单将不会保持对用户输入的响应。这就是困扰我的地方,表单仍然响应,但它只是没有关闭。
【解决方案3】:

我同意@zdimension 的回答,但我补充了一些额外的信息:

  • 首先,在另一个系统上运行应用程序,也许你在这个系统上发生了一些奇怪的事情
  • 在 Close() 调用后检查您正在执行的操作,可能是某些事情减慢了关闭过程
  • 检查您是否在 FormClosing 事件处理程序或类似事件中执行任何操作
  • 检查是否为关闭按钮的 Click 事件添加了其他回调

这些事情可能会帮助您发现是否出现问题,但我认为问题不是您在 Close() 调用之后所做的事情,因为您说表单仍然是响应式的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多