C# 形式可视性问题 Form1.按钮点击(…){ //显示对话框窗体,该窗体在其OnLoad事件上运行方法。 var modemDialog=新modemDialog(“COM25”); modemDialog.ShowDialog(); //直到方法终止,用户才能看到此对话框窗体。 }
是否可以先显示对话框,然后运行指定的方法?C# 形式可视性问题 Form1.按钮点击(…){ //显示对话框窗体,该窗体在其OnLoad事件上运行方法。 var modemDialog=新modemDialog(“COM25”); modemDialog.ShowDialog(); //直到方法终止,用户才能看到此对话框窗体。 },c#,forms,visibility,C#,Forms,Visibility,是否可以先显示对话框,然后运行指定的方法? 谢谢。这是正确的,也是意料之中的。Winforms UI本质上是单线程的。在表单加载事件中使用类似“CheckBalance”的函数调用将阻止表单显示,直到表单加载事件完成。根据任务的持续时间,您有许多选项可供选择: 如果是快速任务,请在显示表单之前提前计算 如果它是用户可能想要发起的,请将其移动到新表单上的按钮,这样它只会根据用户的请求进行计算 如果这是一个长时间运行的任务,需要花费一些时间,那么您需要将它转移到另一个线程中。建议使用 OnLoad在
谢谢。这是正确的,也是意料之中的。Winforms UI本质上是单线程的。在表单加载事件中使用类似“CheckBalance”的函数调用将阻止表单显示,直到表单加载事件完成。根据任务的持续时间,您有许多选项可供选择:
OnLoad
在显示表单之前发生,以允许您初始化表单和变量以及其他内容,这意味着它是同步的。在您从该函数返回之前,表单不会显示
如果要异步运行CheckBalance()
方法,则可以使用一些技术,例如使用线程、线程池或任务API将该工作转移到后台线程,并立即返回以便显示表单
下面是一个使用任务执行相同操作的示例,但异步执行,以便表单立即显示:
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.
}
Action动作=()=>{CheckBalance();};
新任务(操作).Start();
请注意,如果访问UI线程,则需要注意线程安全和调用。在运行
CheckBalance
之前,确保表单可见的简单方法是在表单加载处理程序中使用以下代码:
Action<object> action = () => { CheckBalance(); };
new Task(action).Start();
这将把CheckBalance
方法的执行推送到UI线程消息泵上,以便在前面的所有UI代码完成后执行
其他人是正确的,但是当执行CheckBalance
时,用户界面仍将被阻止。您可能希望在后台线程上运行它以防止出现这种情况
this.BeginInvoke((Action)(() => this.CheckBalance()));