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.
}
是否可以首先显示对话框然后运行指定的方法? 感谢。
答案 0 :(得分:1)
这是正确和预期的。 Winforms UI本质上是单线程的。在表单加载事件中具有类似“CheckBalance”的函数调用将阻止表单显示,直到表单加载事件完成。根据任务的持续时间,您可以使用多种选项:
答案 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
执行时被阻止。您可能希望在后台线程上运行它以防止这种情况。