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

时间:2015-08-17 16:17:42

标签: c# async-await task

我有这段代码:

        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线程暂停并使窗口无响应20-50秒。我有一种感觉任务。等待导致这种停顿。我怎么能修改这个方法,以免发生这种情况。如果我没有任务。等任务列表没有得到正确的任务。

感谢。

1 个答案:

答案 0 :(得分:3)

不要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;
}

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