0

我正在尝试使用 .NET 4.0 任务并行库,但在任务等待方面遇到了一些问题。基本上,我想遍历一个列表,并创建一个任务来为每个项目调用一个 web 服务方法,并行执行它们,然后等待所有任务完成。

我已经尝试过 WaitAll 以及 Wait for all tasks one-by-one 模式,但似乎都不起作用。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我发现所有任务都排队等候,然后我期望等待 Web 服务调用需要相当长的时间,在调用返回之前,这些任务似乎相对较快地完成。

4

1 回答 1

0

我已经针对我的网络服务运行了您的代码,但我无法重现“任务跳过等待并完成”

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

  • Task.WaitAll(taskArray);
  • int index = Task.WaitAny(tasks);
  • var result = tasks[index].Result;
于 2013-04-17T18:44:18.170 回答