.net 不等待的并行任务

.net 不等待的并行任务,.net,.net-4.0,task-parallel-library,.net,.net 4.0,Task Parallel Library,我试图使用.NET4.0任务并行库,但在任务等待方面遇到了一些问题。基本上,我希望遍历一个列表,创建一个任务,为每个项目调用一个webservice方法,并行执行它们,然后等待所有任务完成 我尝试了WaitAll和Wait-for-all模式,但两种模式都不起作用。webservice可能都是并行触发的,但它似乎并不等待webservice响应,因此任务跳过等待并完成 这里有我遗漏的东西吗 foreach (Item currentItem in ItemList) { // create

我试图使用.NET4.0任务并行库,但在任务等待方面遇到了一些问题。基本上,我希望遍历一个列表,创建一个任务,为每个项目调用一个webservice方法,并行执行它们,然后等待所有任务完成

我尝试了WaitAll和Wait-for-all模式,但两种模式都不起作用。webservice可能都是并行触发的,但它似乎并不等待webservice响应,因此任务跳过等待并完成

这里有我遗漏的东西吗

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);
foreach(项目列表中的当前项目)
{
//为webservice调用创建任务。
Task itemTask=Task.Factory.StartNew(()=>
{
项目结果=实用程序.UpdateItem(当前项目);
返回结果;
});
//添加到任务列表中。
taskList.Add(itemTask);
}
//创建任务数组
Task[]taskArray=taskList.ToArray();
//等待任务完成
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);
}
//逐个模式等待所有任务
而(taskList.Count>0)
{
Task[]tasks=taskList.ToArray();
int index=Task.WaitAny(任务);
var result=任务[索引]。结果;
任务列表.RemoveAt(索引);
}

对静态方法
Utilities.UpdateItem
的调用基本上是基于顺序的webservice调用构建一个结果,这些调用修改
对象并返回它。我发现所有的任务都排好了队,然后我预计等待Web服务调用会花费相当长的时间,在调用返回之前,任务似乎会相对较快地完成

我已经在我的Web服务上运行了你的代码,我无法重现“任务跳过等待并完成”

它正在等待完成所有3个等待点(编辑前还有更多),已单独或组合尝试:

  • Task.WaitAll(taskArray)
  • int index=Task.WaitAny(任务)
  • var result=tasks[index].result

使用
并行。Foreach
会更简单。我做你想做的事。“两个似乎都不起作用”并不能告诉我们你观察到了什么。请发布一个简短但完整的程序来演示这个问题。你确定你的代码还没有完成吗?例如,由于你以静默方式处理的异常?UpdateItem中的代码做什么?Task.WaitAll确实有效,试图找出它的错误是浪费时间。我编辑了上面的帖子。我不是在重复,我是在提供一种我正在采取的替代方法,但我没有在我的帖子中解释这一点。