2013-04-17 129 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

更新了我的答案 –