我正在尝试使用.NET 4.0任务并行库,我遇到了任务等待的一些问题。基本上,我想遍历一个列表,并创建一个Task来调用每个项目的webservice方法,并行执行它们,然后等待所有任务完成。并行任务不等待
我已经尝试了WaitAll以及等待所有任务一个接一个的模式,并且都没有工作。 web服务可能全部被并行触发,但是它似乎没有等待web服务响应,所以任务跳过等待并完成。
有什么我在这里失踪?
foreach (Item currentItem in ItemList)
{
// create task for webservice call.
Task<Item> itemTask = Task.Factory.StartNew(() =>
{
Item result = Utilities.UpdateItem(currentItem);
return result;
});
// add to the task list.
taskList.Add(itemTask);
}
// create task array
Task[] taskArray = taskList.ToArray();
//wait for tasks to complete
Task.WaitAll(taskArray);
我也曾尝试以下,作为一个替代方案为WaitAll
// wait for all tasks, one-by-one pattern
while (taskList.Count > 0)
{
Task<Item>[] tasks = taskList.ToArray();
int index = Task.WaitAny(tasks);
var result = tasks[index].Result;
taskList.RemoveAt(index);
}
到静态方法Utilities.UpdateItem
呼叫,基本上建立基于顺序web服务调用,修改Item
对象和结果返回它。我发现的是,所有任务都会排队等待,然后我期待Wait在Web服务调用中花费相当多的时间,这些任务似乎在调用返回之前相对较快地完成。
使用'Parallel.Foreach'会更简单。我做你想做的事情。 – I4V
“似乎没有工作”并不告诉我们你观察到什么。请发布简短但完整的*程序来证明问题。 –
你确定你的代码还没有完成,例如:到你默默处理的异常? UpdateItem中的代码是做什么的? Task.WaitAll绝对有效,试图找到错误的是浪费时间 –