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()));