2011-08-06 86 views
0
Form1.button_Click(...) { 
    // Show a dialog form, which runs a method <CheckBalance()> on it's OnLoad Event. 
    var modemDialog = new ModemDialog("COM25"); 
    modemDialog.ShowDialog(); 
    // the user can't see this dialog form until the method <CheckBalance()> terminates. 
} 

是否可以先显示对话框然后运行指定的方法? 谢谢。窗体Visiblity问题

回答

1

这是正确的和预期的。 Winforms UI本质上是单线程的。在表单加载事件中使用类似“CheckBalance”的函数调用将阻止窗体在表单加载事件完成之前显示。根据任务的持续时间,你有多种选择给您:

  1. 如果它是一个快速任务,展示形式
  2. 如果它的东西,用户可能希望之前提前计算的时间它启动并将其移动到新表单上的按钮,因此仅根据用户的请求进行计算。
  3. 如果长时间运行的任务需要一些时间,则需要将其移至另一个线程。建议使用BackgroundWorker
0

OnLoad发生之前所示的形式,让您初始化形式和变量,哪些不是,这意味着它是同步的。直到您从该功能返回后,表单才会显示。

如果您想异步运行CheckBalance()方法,那么您可以使用一些技术,例如使用线程,ThreadPool或Tasks API将该工作转移到后台线程,并立即返回以便显示表单。

下面是一个使用任务来执行相同的操作的一个例子,但异步使形式立即显示:

Action<object> action =() => { CheckBalance(); }; 
new Task(action).Start(); 

请注意,如果您访问UI线程,你需要提防线程安全和调用。

0

最简单的方法,以确保运行CheckBalance之前窗体是可见的形式加载处理程序使用此代码:

this.BeginInvoke((Action)(() => this.CheckBalance())); 

这将CheckBalance方法的执行推到UI线程消息在所有前面的UI代码完成之后,泵将会执行。

其他的都是正确的,虽然该UI将仍然被封锁作为CheckBalance执行。你可能想在后台线程上运行它来防止这种情况发生。

+0

谢谢确实,工作就像一个魅力。 – Dohamsg