调用Form.Close后窗体未关闭

6
我们在客户端上运行的应用程序出现了奇怪的行为。在一天中的随机时间,某些窗体上的“确定”按钮(调用Form.Close方法)将不会导致该窗体关闭。我的意思是,用户单击按钮,在跟踪中显示Form.Close已被调用,但窗体不会关闭。
奇怪的是,窗体本身仍然响应,因此他们可以单击窗体上的任何按钮,按钮后面的代码将执行,但窗体只是不会关闭。
这种状态持续时间从几秒钟到几分钟不等。然后突然间,窗体开始释放并消失。真的很奇怪。
所以,总结一下,发生以下情况:
- Form.ShowDialog() -> 窗体显示 - 用户在窗体上工作并按下按钮等等 - 调用Form.Close() -> 用户单击了关闭按钮 - 在窗体等待关闭而仍然响应的一段时间内(在此期间,沮丧的用户多次点击关闭按钮但没有响应) - 突然间,窗体释放并从Form.ShowDialog返回一个对话框结果
需要注意的事项:
- 我没有使用任何类型的线程。 - 在某些时候,报告称PC上的explorer.exe进程已停止,这会影响窗体的行为吗?我们正在安排重建PC。 - 我的问题是,是否有人知道可能导致上述行为的情况?
我不是Forms方面的专家,但我的理解是,当您调用Form.Close时,窗体不会立即关闭,首先完成调用Close的当前方法,然后另一个进程触发窗体开始关闭和释放。
这可能与explorer.exe进程未运行有关吗?
非常感谢任何见解。***编辑
还要注意的是,我们无法复制该问题,它随机发生在客户端。

3
这个链接可能对你有用吗?它讨论了在C#中按下“X”或关闭按钮时,WinForms表单不会关闭的问题。 - Simon Karlsson
https://dev59.com/TG865IYBdhLWcg3wQMID - online Thomas
1
@SimonKarlsson 我看了你的链接,但情况不同。Close方法是在模态窗体本身上调用的,因此问题不在于阻塞调用。另外请注意,我们无法复制该问题,它会随机发生。 - user2418900
1
没有复现,我怀疑没有人能够帮助你解决它。因此,我建议你把精力集中在创建复现上。确定可能发生问题的机器和从未出现问题的机器之间的差异。然后,尝试确定哪些差异是重要的。例如操作系统版本、其他正在运行的软件、32位与64位等等。 - Damien_The_Unbeliever
@JeffRSon 我已经搜索了代码,没有找到 "Application.DoEvents"。 - user2418900
显示剩余6条评论
3个回答

1

这让我想起了C#为什么form.Close()不能关闭窗体?

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

我的意思是:

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

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

因为Form.Close不会立即关闭窗体,所以如果在调用后还有代码执行,可能会阻止窗体关闭。

感谢您的建议。在这个Close之后还有一些代码执行,但我们已经添加了跟踪日志来确认该方法是否完成并退出。此外,如果在这个Close之后仍然有一些代码正在执行,那么表单将不会对用户的输入保持响应。这就是让我困惑的地方,即表单仍然可以响应,但它只是没有关闭。 - user2418900

1
也许您可以在关闭之前先隐藏表单,这样用户就不会变得焦躁并尝试关闭它。
Form.Hide();
Form.Close();

另一个原因可能是在窗口关闭或析构函数中,您正在尝试保存较大的文件或进行某些活动。如果是这样,请尝试在线程中完成此操作,以便它可以更快地关闭表单。

谢谢你的建议。我们考虑过隐藏表单,但那只是掩盖问题,并没有解决它。这还可能导致内存问题,因为可能会有多个隐藏的表单存在于后台,所以我们更愿意在继续之前确保表单被释放。此外,如果后台有一个繁忙的进程,表单也不会保持响应。 - user2418900

0

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

  • 首先,在另一个系统上运行应用程序,也许您在这个系统上遇到了一些奇怪的问题
  • 检查Close()调用后您正在做什么,也许有些东西正在减慢关闭过程
  • 检查您是否在FormClosing事件处理程序或类似事件中执行任何操作
  • 检查您是否为关闭按钮添加了其他回调函数。

这些事情可能会帮助您找到问题是否出现了错误,但我不认为问题是由于Close()调用后您所做的事情导致的,因为您说表单仍然可以响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接