并行任务不等待

时间:2013-04-17 16:12:35

标签: .net .net-4.0 task-parallel-library

我正在尝试使用.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调用,任务似乎在调用返回之前相对较快地完成。

1 个答案:

答案 0 :(得分:0)

我已经针对我的网络服务运行您的代码,我无法重现&#34;任务跳过等待并完成&#34;

等待所有3个等待点完成(编辑前有更多),单独尝试并组合使用:

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