2016-01-11 68 views
4

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

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

这种状态持续几秒到几分钟之间的任何事情。然后突然之间表单将开始处置并消失。真奇怪。

因此,要回顾一下,会发生以下情况:

  • Form.ShowDialog() - >形式显示
  • 用户处理形式,并按下按钮等等
  • Form.Close()被称为 - >用户点击了关闭按钮
  • 一段时间过去了,表单正在等待关闭,同时仍然响应(此时沮丧的用户敲击关闭按钮几次而没有响应)
  • 突然形式处置和对话的结果从Form.ShowDialog

东西还给注意:

  • 我没有使用任何类型的线程的。
  • 在某些时候,据报道在PC上停止了explorer.exe进程,这是否会影响表单的行为?我们正在安排PC的重建。

我的问题是,如果有人知道可能导致上述行为的情况?

我不是专家,但据我了解,当你打电话给Form.Close时,窗体并不立即关闭,当前调用Close的第一个方法结束,然后另一个进程触发窗体开始关闭,处置。

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

任何有识之士将不胜感激。

***编辑

还要注意的是,我们不能复制的问题,它在客户端随机发生。

+3

可能[这](http://stackoverflow.com/questions/8113334/winforms-form-wont-close-on-pressing-x-or-close-in-c-sharp)可能吗? –

+0

https://stackoverflow.com/questions/3912836/c-sharp-why-does-form-close-not-close-the-form#answer-19313930 –

+1

@SimonKarlsson我看看你的链接,但它不是同样的情况。 Close方法在模态表单上被调用,因此问题不在阻塞调用中。还要注意,我们不能复制这个问题,它是随机发生的。 – user2418900

回答

0

我想起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) 
} 

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

+0

感谢您的建议。在这之后有一些代码正在执行。关闭但我们已经放入跟踪日志记录以确认方法完成并退出。另外,如果在此之后还有一些代码仍在执行。关闭,表单将不会响应用户的输入。这就是困扰我的事情,表单仍然是响应式的,但它只是没有结束。 – user2418900

0

可能是你可以hide关闭之前,首先让用户不会浮躁不安的形式,并尝试关闭它

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

另一个原因是在窗口关闭或析构函数可能是您要保存更大的文件或一些活动。如果是这样,尝试在线程中做到这一点。这样它会尽快结束表格。

+0

感谢您的建议。我们想过隐藏表格,但这只是将问题笼罩在地毯下而不是解决问题。它也可能导致内存问题,因为可能会有多种形式隐藏在后台,所以我们宁愿确保表单在继续之前处理。此外,如果进程在后台忙碌,表单将不会响应。 – user2418900

0

我同意@zdimension的答案,但我添加一些额外的信息:

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

这些事情可能会帮助您查找是否出现问题,但我不认为问题是您在Close()调用后执行的操作,因为您声称表单仍然响应。