对于我的应用程序,我需要有一个进度条表单,用于长时间运行的数据包络作业/大型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);
}