调用ShowDialog()后如何继续执行代码

Set*_*eth 17 c# forms continue

Form.ShowDialog()方法导致代码暂停,直到新调用的窗体关闭.我需要在调用ShowDialog()方法后继续运行代码.我用谷歌搜索并阅读有关使用backgroundworker的内容?但这是我第一次听说过,从未使用过它.

Form2 form2this = new Form2();
form2this.ShowDialog();
MessageBox.Show("Something");
Run Code Online (Sandbox Code Playgroud)

单击按钮后执行此代码,如何仍然调用ShowDialog以防止用户与主窗体交互,但仍然允许主窗体继续其工作?

很抱歉,如果已经讨论过,但我发现的一切似乎都很难执行这么简单的任务.我实际上很惊讶它不包含在SHowDialog方法中.例如ShowDialog().继续会很酷.

Ser*_*rvy 17

  • 如果您只是希望代码继续而不是阻塞,直到弹出窗口关闭,请考虑使用Show而不是ShowDialog.

  • 如果您希望在子表单启动时让父表单执行某些操作,那么是的,使用BackgroundWorker(或者只是手动启动新的线程/任务)可能是合适的.了解更多关于该任务的内容将会有所帮助.如果你需要与主表格或儿童表格互动,那对我来说似乎很麻烦; 如果你只是需要做一些没有UI交互的后台任务,那么这是正确的思路.

  • 另一种可能性是,您想要做的事情应该是在子表单中完成的,而不是父表单.

  • 谢谢.我不能使用Show而不是ShowDialog的原因是因为我不希望用户能够与parentForm进行交互.但是,我可以在使用Show方法时合并parentForm.Enabled = false选项.然后,一旦调用show方法并显示子表单,一旦关闭,它将重新启用父表单.我正在调用第二种形式,它有一个内置的计时器,以便在计时器启动时自动关闭.第二种形式几乎只是一种形式,其上带有标签,指示耐心,因为父母的形式正在做一些时间 (3认同)

Joe*_*age 7

只要在打开模式对话框期间执行异步操作,就可以像下面所示一样简单地进行,假设button1_Click()是按钮的事件处理程序.

private async void button1_Click(object sender, EventArgs e)
{
    // create and display modal form
    Form2 modalForm = new Form2();
    BeginInvoke((Action)(() => modalForm.ShowDialog()));

    // do your async background operation
    await DoSomethingAsync();

    // close the modal form
    modalForm.Close();
}


private async Task DoSomethingAsync()
{
    // example of some async operation....could be anything
    await Task.Delay(10000);
}
Run Code Online (Sandbox Code Playgroud)

我发现当我使用建议使用Show()的解决方案时,我可能会在我想要模态的对话框最终在主窗体后面,在应用程序之间来回切换的情况下结束.当我使用上述解决方案时,这种情况从未发生