2013-04-17 130 views
0

我正在尝试使用.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服务调用中花费相当多的时间,这些任务似乎在调用返回之前相对较快地完成。

+2

使用'Parallel.Foreach'会更简单。我做你想做的事情。 – I4V

+3

“似乎没有工作”并不告诉我们你观察到什么。请发布简短但完整的*程序来证明问题。 –

+0

你确定你的代码还没有完成,例如:到你默默处理的异常? UpdateItem中的代码是做什么的? Task.WaitAll绝对有效,试图找到错误的是浪费时间 –

回答

0

我碰到你的代码对我的web服务,我不能重现“任务跳过等待和完整”

它是在等待全取3分等待完成(有更多的编辑前),已经尝试单独和组合:

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

我编辑了我的上述帖子。我没有复制,我提供了另一种方法,但我没有在我的帖子中解释。 – mflair2000

+0

更新了我的答案 –