我有这段代码:
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秒。我有一种感觉任务。等待导致这种停顿。我怎么能修改这个方法,以免发生这种情况。如果我没有任务。等任务列表没有得到正确的任务。
感谢。
答案 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将不会被阻止。