2012-05-20 61 views
0
Task<string>[] tableOfWebClientTasks = new Task<string>[taskCount]; 

for (int i = 0; i < taskCount; i++) 
{ 
    tableOfWebClientTasks[i] = new WebClient().DownloadStringTask(allUrls[count - i - 1]); 
} 

Task.Factory.ContinueWhenAll(tableOfWebClientTasks, tasks => 
{ 
    Parallel.ForEach(tasks, task => 
    { 
     //Here I have result from each task. 
     //But information which url is executed on this task, is lost. 
    }); 
}); 

例如,我可以創建類(具有兩個公共屬性,一個用於任務,第二個用於URL)並返回實例。但是,這種方法我與其他方法連接。如何從「第三方」庫中的方法返回另一個值?

你有這個問題的一些解決方案嗎?

+1

爲什麼你使用'ContinueWhenAll()'和'Paralell.ForEach ()'?每個'Task'上的ContinueWith()都不會更好? – svick

+0

請看這裏:http://blogs.msdn.com/b/pfxteam/archive/2010/05/04/10007557.aspx – mike00

+1

那篇文章沒有解釋*爲什麼*你是這樣做的。爲什麼每個'Task'上的'ContinueWith()'都不適合你? – svick

回答

1

如果你希望能夠到你的工作與創建它們,你可以使用字典進行映射的URL相關聯:

Task<string>[] tableOfWebClientTasks = new Task<string>[taskCount]; 
var taskIdToUrl = new Dictionary<int,string>(); 

for (int i = 0; i < taskCount; i++) 
{ 
    var url = allUrls[count - i - 1]; 
    var task = new WebClient().DownloadStringTask(url); 
    tableOfWebClientTasks[i] = task; 
    taskIdToUrl.Add(task.Id, url); 
} 

TaskFactory.ContinueWhenAll(tableOfWebClientTasks, tasks => 
{ 
    Parallel.ForEach(tasks, task => 
    { 
     // To get the url just do: 
     var url = taskIdToUrl[task.Id]; 
    }); 
}); 
+0

我認爲這樣做總體上並不是一個好主意(儘管它可能適用於這種特定情況)。例如,一些異步方法可能會爲多個不同的輸入返回相同的「Task」,這會破壞您的代碼。 – svick

+0

是的。除非有一些具體的理由來這樣做,我同意在每個'Task'上調用'ContinueWith()'。 – RichardTowers

+0

@RichardTowers謝謝,確實是我想要的這種東西。 – mike00

相關問題