2012-05-03 44 views
0

我目前正在使用Windows窗体GUI的应用程序。应用程序的主要工作将在另一个线程上执行 - 但它可能取决于表单的状态。
正因为如此,在创建线程之前,我必须确保表单完全加载了,。此外,我需要确保线程在之前终止表单开始关闭。当表单加载并在表单关闭之前执行代码

此问题的可能解决方案可能会覆盖OnShownOnFormClosing方法。
OnShow方法是否只有在窗体的所有资源都被加载后才真正被调用?那么OnFormClosing - 我可以确定在这个方法中执行的任何代码将在
之前执行表单开始关闭/处置吗?

回答

2

我建议你通过的WinForms事件顺序读MSDN上张贴:

http://msdn.microsoft.com/en-us/library/86faxx0d.aspx

+0

这是一个有趣的阅读,但不幸的是,似乎即使是第一个事件('OnClosing' /'OnFormClosing')在表单处理后被触发。我唯一能想到的就是重写close方法...... – Acidic

+0

OnClosing在处理完事后肯定不会被解雇.... – debracey

2

Windows窗体事件可能会非常棘手,它们触发的顺序不可靠。例如,“显示”事件旨在仅在表单第一次显示时触发一次,而且仅在昨天,我发现了一种方法,可以在正确的时间通过操作Form.Visible标志完全防止该事件触发。

所以,你需要对你的需求有相当的具体。例如 - 当你说'完全加载'时,你是什么意思?创建控件,表单可见,表单构造函数完成执行?

同样,FormClosing事件可能会被主要aUI线程中未处理的异常绕过,这会导致在没有事件触发的情况下移除表单。

我建议不要假设这些事件。使您的工作线程能够处理表单状态不可用或未准备好。不知道你的具体要求,很难更具体。

+0

当谈到这件事时,我也遇到了一些不可靠性,但对我来说,似乎如果我能减少异常超出这个水平的机会,这可能就足够了。我不打算在表单本身之外做任何超出基本的事情。与窗体的唯一外部交互可能如下所示:'form.Invoke(form.Refresh)'或'form.BeginInvoke(form.Refresh)'。 – Acidic

0

您是否尝试过用你的主要的WinForm的构造函数的InitializeComponent和使用的OnLoad(称为每当一切加载)?

相关问题