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 不会被阻止。
我有这个代码:
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 不会被阻止。