2012-05-20 3 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에 두 번째) 인스턴스를 반환 할 수 있습니다. 하지만이 방법은 내가 다른 사람과 연결 방법."third party"lib의 메소드에서 다른 값을 반환하는 방법은 무엇입니까?

이 문제에 대한 해결책이 있습니까?

+1

을()'? 각'Task'에서'ContinueWith()'가 더 좋지 않습니까? – svick

+0

여기를 참조하십시오 : http://blogs.msdn.com/b/pfxteam/archive/2010/05/04/10007557.aspx – mike00

+1

해당 게시물은 설명하지 않습니다 * 이유 * 당신이 이런 식으로하고 있습니다. 왜 각'Task'에서'ContinueWith()'가 당신에게 적합하지 않습니까? – svick

답변

1

당신은 매핑 할 수있는 사전을 사용할 수를 생성 한 URL을 사용하여 작업을 연결할 수 있도록하려면 : 당신은``Paralell.ForEach을 ContinueWhenAll()`등을 사용하는 이유는

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

나는이 방법을 생각하는 것이 일반적으로 좋은 아이디어는 아니라고 생각합니다 (비록이 특별한 경우에 효과가있을지라도). 예를 들어, 일부 비동기 메서드는 여러 다른 입력에 대해 동일한 '작업'을 반환 할 수 있으므로 코드가 손상 될 수 있습니다. – svick

+0

예. 이런 식으로해야 할 구체적인 이유가 없으면 각 Task에서'ContinueWith() '를 호출하는 것에 동의합니다. – RichardTowers

+0

@RichardTowers 고마워, 정말로 내가 원했던 그런 일. – mike00