2011-04-12 45 views
1

我在c#winforms应用程序(Visual Studio 2010,.net 4)中有一个带有后台工作器的窗体。当后台工作人员忙时,我想在尝试关闭表单并取消表单关闭时提醒用户。我想通过将表单关闭取消设置为true来在表单关闭事件中处理它。当后台工作正在进行时,无法停止窗体关闭

但它仍然关闭窗体!

这里是代码片段我用:

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

哪里是错误?

在此先感谢!

回答

2

您确定myBackgroundWorker.IsBusy返回true?你有没有尝试在检查中设置一个断点以确保它被调用?

您确定该事件正确连接?

如果这些事情是真的,那么这个错误将不得不在代码的其他部分。

FormClosing设置Cancelfalse也可能有一些其他处理程序,但这可能是一个不太可能的情况。

+0

是的,我相信,除此之外,一切正常,isbusy返回true。是的,事件正确地连接起来。 – Tom 2011-04-12 19:57:01

+0

@Tamas当你在'e.Cancel = true;'上设置一个断点时会发生什么?并且遍历代码? – Davy8 2011-04-12 19:58:37

+0

即使取消设置为true,它也会简单地关闭表单。总而言之,我发现了这个错误的原因:我使用开源的UI组件来创建像IDE这样的Visual Studio(http://www.codeproject.com/KB/toolbars/VS_IDE_Dock_Container.aspx),正如我现在看到的那样导致的问题,它使窗体关闭在后台一些技巧,并没有以正确的方式使用取消...伤心的消息,我需要这个组件,也取消...感谢您的帮助! – Tom 2011-04-12 20:09:14

0

如果您在消息之前移动e.Cancel,该怎么办?

请注意,如果您尝试阻止竞争条件并停止InvalidOperationException在表达式关闭之前完成工作,它不会100%这样做;您可以在完成本身(InProgress现在为false)和回调(OnWorkerCompleted)之间的间隔内关闭它。你仍然需要处理异常。

既然您必须处理它,那么您最好还是让用户关闭表单。用户不得不等待一些他们不关心的事情才能完成。

+0

Thx为您的答案,但它听起来对我来说真的很糟糕。我只想取消表格结束,而不是更多。不应该那么棘手。这就像狩猎与F14雄猫一样的鸽子......无论如何,感谢你的帮助! ;) – Tom 2011-04-12 20:01:10

相关问题