Task.WaitAll(tasks.ToArray());冻结

时间:2017-12-31 08:17:30

标签: c# arrays task wait

我会重新解释这个问题。这是我想要做的简化代码。 标签 将是动态的,必须在函数中传递。函数startCount()将会做更多的事情,我想为每个函数添加线程以节省时间。代码工作正常(现在计算和更改值) 完成所有任务后,我还需要执行其他功能 我在startCount()函数中取出了额外的任务

至于其他示例,我现在没有使用await并删除startCount()中的任务,现在程序已冻结。

private void Form1_Load(object sender, EventArgs e)
{
    strCounter.Add("66");   //Simulate reading file 
    strCounter.Add("69");

    labels = new Label[strCounter.Count];   //Create the Array of Labels

    for (int i = 0; i < strCounter.Count; i++)
    {
        labels[i] = new Label();            //Create label and add it to Form
        labels[i].Size = new Size(30, 15);
        labels[i].Location = new Point(10, 50 + (i * 20));
        labels[i].Text = strCounter[i];
        this.Controls.Add(labels[i]);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    List<Task> tasks = new List<Task>();    //Create List of Tasks

    for (int i = 0; i < strCounter.Count; i++)
    {
        int ii = i;
        Task LastTask = new Task(() => startCount(i.ToString(), labels[ii]));

        tasks.Add(LastTask);
        tasks[i].ConfigureAwait(false);
        tasks[i].Start();

    }
    // This line will cause the entire program to freeze.
    // If i comment out, the program works fine.
    Task.WaitAll(tasks.ToArray());

    MessageBox.Show("Should be After");
}

private void startCount(string strCount, Label lbl)
{
    for (int i = 0; i < 100; i++)
    {
        int count = int.Parse(lbl.Text) + 1;    //Add 1
        writeLabelBox(lbl, count.ToString());   //Use Invoke function
        Thread.Sleep(20);
    }
}

public void writeLabelBox(Label l, string strA)
{
    this.Invoke((MethodInvoker)delegate()
    {
        l.Text = strA;
    });
}

1 个答案:

答案 0 :(得分:2)

您已在函数内创建任务并将其返回。 所以你不需要创建另一个任务 你只是在等待错误的任务。

更改此行:

Task LastTask = new Task(() => startCount(i.ToString(), labels[ii]));

To This:

Task LastTask = startCount(i.ToString(), labels[ii]);

然后删除tasks[i].Start();,因为它已经在函数中启动了。

或保持原样,但不要在函数中创建Task

在任何情况下,为什么要为每个标签创建一个任务而不是为整个循环创建一个任务?