Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在显示ProgressBar时执行一个方法,然后在之后显示一个表单?_C#_Multithreading_Winforms_Progress Bar - Fatal编程技术网

C# 如何在显示ProgressBar时执行一个方法,然后在之后显示一个表单?

C# 如何在显示ProgressBar时执行一个方法,然后在之后显示一个表单?,c#,multithreading,winforms,progress-bar,C#,Multithreading,Winforms,Progress Bar,如何在显示ProgressBar时执行一个方法,然后在之后显示一个表单 private void btnCienciaEmissao_Click(object sender, EventArgs e) { var progressForm = new ProgressBar.frmPBText(); var retornoManifestacao = new frmConsultaNotaEmitidaContraCNPJAntigoRetornoManifestacao();

如何在显示ProgressBar时执行一个方法,然后在之后显示一个表单

private void btnCienciaEmissao_Click(object sender, EventArgs e)
{
    var progressForm = new ProgressBar.frmPBText();
    var retornoManifestacao = new frmConsultaNotaEmitidaContraCNPJAntigoRetornoManifestacao();

    var threadProcesso = new Thread(() =>
        {
            Parametros.DgvRetornoManifestacao = ExecutaManifestacao();
            progressForm.BeginInvoke(new Action(() => { progressForm.Close(); }));
            retornoManifestacao.BeginInvoke(new Action(() => { retornoManifestacao.dgvRetornoManifestacaoDataSource(Parametros.DgvRetornoManifestacao);}));
        });

    threadProcesso.Start();

    progressForm.Show();

    // I WANT TO SHOW RetornoManifestacao ONLY AFTER threadProcesso FINISHED
    retornoManifestacao.Show();
}
我希望表单在threadProcesso完成后显示

如果像上面一样使用retronomanifestacao.Show,表单将显示在threadProcesso结束之前。我需要它只出现在线程结束后

我尝试使用threadProcesso.Join,但progressForm冻结了


我的progressForm有一个选框样式的ProgressBar,因此不需要报告进度。

您只需将调用移动到线程中即可,这样它就可以像线程执行的最后一件事一样执行。例如:

private void btnCienciaEmissao_Click(object sender, EventArgs e)
{
    var progressForm = new ProgressBar.frmPBText();
    var retornoManifestacao = new frmConsultaNotaEmitidaContraCNPJAntigoRetornoManifestacao();

    var threadProcesso = new Thread(() =>
        {
            Parametros.DgvRetornoManifestacao = ExecutaManifestacao();
            progressForm.BeginInvoke((MethodInvoker)(() =>
            {
                // These can (and should) all go in a single invoked method
                progressForm.Close();
                retornoManifestacao.dgvRetornoManifestacaoDataSource(Parametros.DgvRetornoManifestacao);
                retornoManifestacao.Show();
            }));
        });

    threadProcesso.Start();

    progressForm.Show();
}
也就是说,如果您使用的是.NET 4.5,在我看来,总体而言,一种稍有不同的方法会更好:

private async void btnCienciaEmissao_Click(object sender, EventArgs e)
{
    var progressForm = new ProgressBar.frmPBText();

    progressForm.Show();
    Parametros.DgvRetornoManifestacao = await Task.Run(() => ExecutaManifestacao());
    progressForm.Close();

    var retornoManifestacao = new frmConsultaNotaEmitidaContraCNPJAntigoRetornoManifestacao();

    retornoManifestacao.dgvRetornoManifestacaoDataSource(Parametros.DgvRetornoManifestacao);
    retornoManifestacao.Show();
}

实际上很容易做到..也许你应该在显示表单之前用谷歌搜索一下如何创建一个启动屏幕或显示一个进度条..@grantwiney如果我使用retronomanifestacao.show,就像上面一样,表单将显示在threadProcesso结束之前。我需要它只出现在线程结束后。