形成可见性问题

时间:2011-08-06 05:11:36

标签: c# forms visibility

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.
}

是否可以首先显示对话框然后运行指定的方法? 感谢。

3 个答案:

答案 0 :(得分:1)

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

  1. 如果这是一项快速任务,请在显示表单之前提前计算
  2. 如果是用户可能想要启动的内容,请将其移至新表单上的按钮,以便仅根据用户的请求进行计算
  3. 如果这是一项需要一段时间的长时间运行任务,则需要将其移至另一个线程。建议使用BackgroundWorker

答案 1 :(得分:0)

OnLoad之前出现,表单允许您初始化表单和变量,这意味着它是同步的。从该函数返回后,表单才会显示。

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

以下是使用Task执行相同操作但是异步执行以便表单立即显示的示例:

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

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

答案 2 :(得分:0)

CheckBalance运行之前确保表单可见的简单方法是在表单加载处理程序中使用此代码:

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

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

其他人都是正确的,但UI仍会在CheckBalance执行时被阻止。您可能希望在后台线程上运行它以防止这种情况。