C# 如何从“中”的方法返回另一个值;“第三方”;自由党? Task[]tableOfWebClientTasks=新任务[taskCount]; 对于(int i=0;i { Parallel.ForEach(任务,任务=> { //这里我有每个任务的结果。 //但是在这个任务上执行哪个url的信息丢失了。 }); });
例如,我可以创建类(有两个公共属性,一个用于任务,另一个用于url)并返回实例。但是我把这个方法和其他方法联系起来了C# 如何从“中”的方法返回另一个值;“第三方”;自由党? Task[]tableOfWebClientTasks=新任务[taskCount]; 对于(int i=0;i { Parallel.ForEach(任务,任务=> { //这里我有每个任务的结果。 //但是在这个任务上执行哪个url的信息丢失了。 }); });,c#,task-parallel-library,parallel-extensions,C#,Task Parallel Library,Parallel Extensions,例如,我可以创建类(有两个公共属性,一个用于任务,另一个用于url)并返回实例。但是我把这个方法和其他方法联系起来了 您对此问题有什么解决方案吗?如果您希望能够将任务与创建它们的url相关联,可以使用字典进行映射: Task<string>[] tableOfWebClientTasks = new Task<string>[taskCount]; for (int i = 0; i < taskCount; i++) { tableOfWebClient
您对此问题有什么解决方案吗?如果您希望能够将任务与创建它们的url相关联,可以使用字典进行映射:
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.
});
});
Task[]tableOfWebClientTasks=新任务[taskCount];
var taskIdToUrl=新字典();
对于(int i=0;i
{
Parallel.ForEach(任务,任务=>
{
//要获取url,只需执行以下操作:
var url=taskIdToUrl[task.Id];
});
});
为什么要使用continuewheall()
和Paralell.ForEach()
?ContinueWith()
对每个任务不是更好吗?请看这里:这篇文章没有解释你为什么要这样做。为什么ContinueWith()
对每个Task
都不适合您呢?我认为一般来说,以这种方式进行操作不是一个好主意(尽管在这种特定情况下它可能会起作用)。例如,某些异步方法可能会为多个不同的输入返回相同的任务
,这会破坏您的代码。是的。除非有具体的理由这样做,否则我同意在每个任务上调用ContinueWith()
@RichardTowers谢谢,这确实是我想要的。
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];
});
});