如何在显示进度表单时自动执行RunWorkerAsync

时间:2016-05-14 22:45:57

标签: c# forms asynchronous backgroundworker

对于我的应用程序,我需要有一个进度条表单,用于长时间运行的数据包络作业/大型OpenXML Excel文件写入,因此我创建了一个"弹出窗口"形式称为" RunEnvelope_Form"。它很简单,包含进度条,状态框,取消按钮和关闭按钮。我正在利用一个后台工作人员来完成工作正常的数据包络/ Excel文件编写工作。

为了让BackgroundWorker.RunWorkerAsync自动执行,我已将它添加到RunEnvelope_Form的Shown事件的末尾( SEEMED 就像一个好主意)。 BackgroundWorker成功执行,但我遇到了一些问题:

[1]无法移动进度窗口 [2]最重要的是,在执行RunWorkerCompleted事件之前,“取消”按钮无响应。

考虑一下,因为我怀疑主表单还没有进入消息循环吗?

所以我的问题是,在显示表单时自动启动RunWorkerAsync的最佳方法是什么?我真的很想避免一个启动按钮,这似乎是我遇到的MSDN示例中的常态。

这是我在主应用程序窗口中显示表单的方式:

DialogResult dr = EnvelopeResults.ShowDialog();

这是RunEnvelope_Form表单中的Shown事件(请注意,在表单的构造函数中设置了所有Worker线程机制):

private void RunEnvelope_Form_Shown(object sender, EventArgs e)    
        {  
        // GUI setup  

        CanceAsyncButton_Click.Enabled = true;  
        CloseFormOKButton_Click.Enabled = false;  
        Status_Label.Text = ""; 
        EnvelopeProgress_Bar.Value = 0; 
        EnvelopeProgress_Bar.Style = ProgressBarStyle.Continuous;  
        EnvelopeProgress_Bar.ForeColor = Color.Green;  

        // setup a tuple to handle input data to worker thread (I like Tuples)  

        Tuple<AnalysisSeries, Dictionary<int, bool>, string> aysncData =  
            new Tuple<AnalysisSeries, Dictionary<int, bool>, string>  
            (_Aseries, _CasestoRender, _OutputXLS);  

        // now can start the envelope process  

        EnvelopeResults_Worker.RunWorkerAsync(aysncData);  
    }

0 个答案:

没有答案