【发布时间】:2015-04-15 00:17:49
【问题描述】:
**最终我将有四个任务同时运行,并有另一个包含四个进度条的表单。我希望每个进度条在其工作任务完成时更新。
这就是我想要为初学者做的事情。
我有一个表单,上面有一些按钮。当我单击一个时,我正在创建一个新任务来做一些工作。
public partial class MyMainForm : Form
{
private void btn_doWork_Click(object sender, EventArgs e)
{
Task task = new Task(RunComparisons);
task.Start();
}
private void RunComparisons()
{
int progressBarValue = 0;
MyProgressBarForm pBar = new MyProgressBarForm(maxValue, "some text");
pBar.ShowDialog();
foreach(string s in nodeCollection)
{
//do some work here
progressBarValue++;
pBar.updateProgressBar(progressBarValue, "some new text");
}
pBar.BeginInvoke(new Action(() => pBar.Close()));
}
}
在另一个包含带有进度条的表单的类中:
public partial class MyProgressBarForm : Form
{
public MyProgressBarForm(int maxValue, string textToDisplay)
{
InitializeComponent();
MyProgressBarControl.Maximum = maxValue;
myLabel.Text = textToDisplay;
}
public void updateProgressBar(int progress, string updatedTextToDisplay)
{
MyProgressBarForm.BeginInvoke(
new Action(() =>
{
MyProgressBarControl.Value = progress;
myLabel.Text = updatedTextToDisplay;
}));
}
当我单击 doWork 按钮时,进度条表单会显示但不会更新。它只是坐在那里挂起。如果我注释掉 pBar.ShowDialog();那么进度条表单不显示,但要完成的工作完美地运行完成。
当我创建自己的线程时,我可以完美地运行它,但我阅读了有关 Tasks 的信息,现在我正试图让它以这种方式运行。我哪里做错了?
【问题讨论】:
-
不要在后台任务/线程中创建表单/控件。如果你这样做,那么你必须为这些线程创建一个消息泵。
-
@EZI,你有这样的例子吗?
-
你考虑过使用BackgroundWorker吗?这似乎是一个很好的用例