【问题标题】:Can't stop form closing when background worker is in progress后台工作人员正在进行时无法停止表单关闭
【发布时间】:2011-04-12 19:41:00
【问题描述】:

我在 c# winforms 应用程序(Visual Studio 2010,.net 4)中有一个带有后台工作人员的表单。当后台工作人员很忙时,我想在尝试关闭表单并取消表单关闭时警告用户。我想通过将表单关闭取消设置为 true 在表单关闭事件中处理它。

但它仍然关闭表单!

这是我使用的代码sn-p:

private void FormDrivenDistance_FormClosing(object sender, FormClosingEventArgs e)
{
  if (myBackgroundWorker.IsBusy)
  {
     Messenger.ShowCriticalMessage("Don't close, in progress!");
                    e.Cancel = true;
  }
} 

错误在哪里?!

提前致谢!

【问题讨论】:

    标签: c# forms


    【解决方案1】:

    您确定myBackgroundWorker.IsBusy 返回true?您是否尝试过在检查中设置断点以确保它被调用?

    您确定事件已正确连接吗?

    如果这些都是真的,那么错误就必须在代码的其他部分。

    FormClosing 上可能还有一些其他处理程序将 Cancel 设置为 false,但这可能不太可能发生。

    【讨论】:

    • 是的,我敢肯定,除此之外一切正常,isbusy 返回 true。是的,事件已正确连接。
    • @Tamas 在e.Cancel = true; 上设置断点并单步执行代码会发生什么?
    • 它只是关闭表单,即使取消设置为 true。总而言之,我找到了错误的原因:我使用开源 UI 组件来创建类似 IDE (codeproject.com/KB/toolbars/VS_IDE_Dock_Container.aspx) 的 Visual Studio,正如我现在看到的那样,它导致了问题,它在后台关闭表单时产生了一些技巧并且没有以正确的方式使用取消...对我来说是个悲伤的消息,我需要这个组件,也需要取消...再次感谢您的帮助!
    • @Tamas 如果删除Messenger.ShowCriticalMessage 行,它是否有效?除非那个方法有什么奇怪的地方,如果你说的是真的,它应该可以工作。
    • @Tamas 那篇代码项目文章确实提到了如果您在该页面上搜索“防止表单关闭”,您应该如何防止他们的表单关闭。你试过吗?
    【解决方案2】:

    如果您在消息之前移动 e.Cancel 会怎样?

    请注意,如果您试图阻止竞态条件并停止在工作人员完成之前关闭表单时导致的 InvalidOperationException,它不会 100% 这样做;您可以在完成本身(InProgress 现在为 false)和回调(OnWorkerCompleted)之间的时间间隔关闭它。无论哪种方式,您仍然需要处理异常。

    由于您必须以任何一种方式处理它,您还不如让用户关闭表单。用户不得不等待他们不关心的事情完成是很烦人的。

    【讨论】:

    • 感谢您的回答,但这对我来说听起来真的很糟糕。我只想取消表格关闭,仅此而已。不应该这么棘手。这就像用 F14 Tomcat 寻找鸽子......无论如何,谢谢你的帮助! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多