我正在尝试使用.NET 4.0任务并行库,我遇到了Task Wait的一些问题。基本上,我想迭代一个列表,并创建一个Task来为每个项调用webservice方法,并行执行它们,然后等待所有任务完成。
我已经尝试了WaitAll以及等待所有任务的逐个模式,似乎都没有用。 web服务可能全部并行触发,但是它似乎不等待webservice响应,因此Task跳过Wait并完成。
我在这里缺少什么吗?
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
的调用,基本上是基于顺序webservice调用构建结果,这些调用修改Item
对象并返回它。我发现所有任务都排队等待,然后我期待等待花费相当多的时间进行webservice调用,任务似乎在调用返回之前相对较快地完成。
答案 0 :(得分:0)
我已经针对我的网络服务运行您的代码,我无法重现&#34;任务跳过等待并完成&#34;
等待所有3个等待点完成(编辑前有更多),单独尝试并组合使用:
Task.WaitAll(taskArray);
int index = Task.WaitAny(tasks)
; var result = tasks[index].Result;