【发布时间】:2014-01-16 16:45:56
【问题描述】:
我想尝试使用 Threading.Task (C#) 来并行运行一些工作。在这个简单的示例中,我有一个带有进度条和按钮的表单。单击时调用 RunParallel 函数。没有 Task.WaitAll() 它似乎运行良好。但是,使用 WaitAll 语句,表单显示并且没有任何反应。我不明白我在下面的设置中做错了什么。 提前致谢。
public partial class MainWindow : Form
{
public delegate void BarDelegate();
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, EventArgs e)
{
RunParallel();
}
private void RunParallel() {
int numOfTasks = 8;
progressBar1.Maximum = numOfTasks;
progressBar1.Minimum = 0;
try
{
List<Task> allTasks = new List<Task>();
for (int i = 0; i < numOfTasks; i++)
{
allTasks.Add(Task.Factory.StartNew(() => { doWork(i); }));
}
Task.WaitAll(allTasks.ToArray());
}
catch { }
}
private void doWork(object o1)
{
// do work...
// then
this.Invoke(new BarDelegate( UpdateBar ));
}
private void UpdateBar()
{
if (progressBar1.Value < progressBar1.Maximum) progressBar1.Value++;
}
}
【问题讨论】:
-
Task.WaitAll 是一个阻塞操作。改用 ContinueWith 或 ContinueWhenAll 方法
-
这就是 WaitAll 所做的,它会阻塞直到所有任务完成。任务无法完成,因为 Invoke 将在 UI 线程上运行其操作,该线程已被 WaitAll 阻止
标签: c# task-parallel-library task