task.Wait 导致我的 GUI 线程长时间停顿

task.Wait causing a long pause in my GUI thread

我有这个代码:

        public async Task<string> Solve(List<List<Node>> nodeList)
    {
        List<Task> taskList = new List<Task>();

        for (int i = 0; i < nodeList.Count(); i++)
        {
            int taskNo = i;
            Task<List<Node>> task = Task.Factory.StartNew((x) =>
            {
                List<Node> nodes = new List<Node>(nodeList[i]);
                Calculate(nodes);
                return nodes;
            }, taskNo);

            task.Wait();
            taskList.Add(task);

        }

        Task<string> r = BuildReport(taskList);

        return r;
    }

我的 UI 线程上的另一个方法正在调用此方法。 此方法导致我的 UI 线程暂停并使 window 无响应 20-50 秒。我感觉 task.Wait 导致了这次暂停。我该如何修改此方法,以免发生这种情况。如果我没有 task.Wait,taskList 就不会在其中获得正确的任务。

谢谢。

不要Wait你的任务。使用 await Task.WhenAll(taskList); 您的代码将类似于:

public async Task<string> Solve(List<List<Node>> nodeList)
{
    List<Task> taskList = new List<Task>();

    for (int i = 0; i < nodeList.Count(); i++)
    {
        int taskNo = i;
        Task<List<Node>> task = Task.Factory.StartNew((x) =>
        {
            List<Node> nodes = new List<Node>(nodeList[taskNo]); //replace i with taskNo
            Calculate(nodes);
            return nodes;
        }, taskNo);

        // remove Wait
        taskList.Add(task);

    }

    await Task.WhenAll(taskList); //Add this line
    Task<string> r = BuildReport(taskList);

    return r;
}

在您当前的代码中,您创建了一个任务,然后等待它完成。这与按顺序 运行ning 您的代码没有太大区别。在这里使用 Task.WhenAll 有两个好处。 a) 您的任务将 运行 并行 b) 由于我们正在 等待 它,您的 UI 不会被阻止。