我想尝试使用 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++;
    }
}

最佳答案

您正在等待 UI 线程。这会卡住 UI。不要那样做。

此外,您会死锁,因为 Invoke 等待 UI 线程解除阻塞。

我的建议:尽可能使用 async/await

并且请不要吞下异常。你正在为自己创造 future 的工作。

关于c# - Task.WaitAll 卡住应用程序 C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21167757/

10-10 07:22