C#并行运行任务,并将每个任务与输入关联 公共类输入 { 公共布尔参数{get;set;} 公共字符串参数二{get;set;} }
我有一个要并行处理的C#并行运行任务,并将每个任务与输入关联 公共类输入 { 公共布尔参数{get;set;} 公共字符串参数二{get;set;} },c#,asynchronous,parallel-processing,task,task-parallel-library,C#,Asynchronous,Parallel Processing,Task,Task Parallel Library,我有一个要并行处理的列表,将输入与输出关联起来。我循环浏览这个列表来构建Tasks var results=newlist(); foreach(输入中的var输入) { 输出=等待过程(输入); 结果。添加((输入,输出)); } 但这并不是平行进行的。我希望是这样 var inputsAndTasks=new List(); foreach(输入中的var输入) { 任务输出=过程(输入); 添加((输入,输出)); } Output[]results=wait Task.WhenAll(
列表
,将输入与输出关联起来。我循环浏览这个列表来构建Task
s
var results=newlist();
foreach(输入中的var输入)
{
输出=等待过程(输入);
结果。添加((输入,输出));
}
但这并不是平行进行的。我希望是这样
var inputsAndTasks=new List();
foreach(输入中的var输入)
{
任务输出=过程(输入);
添加((输入,输出));
}
Output[]results=wait Task.WhenAll(inputsAndTasks.Select(i=>i.OutputTask));
//结果不再与其输入关联!
如何并行运行此操作,但保留输入与输出的关联?我不想让输入成为输出上的对象。您只需等待
之后,再执行循环以匹配输入和输出
var inputsAndTasks = new List<(Input Input, Task<Output> OutputTask)>();
foreach (var input in inputs)
{
Task<Output> output = Process(input);
inputsAndTasks.Add((input, output));
}
await Task.WhenAll(inputsAndTasks.Select(i => i.OutputTask));
var results = new List<(Input, Output)>();
foreach (var x in inputsAndTasks)
{
Output output = await x.OutputTask;
results.Add((x.Input, output));
}
var inputsAndTasks=new List();
foreach(输入中的var输入)
{
任务输出=过程(输入);
添加((输入,输出));
}
wait Task.WhenAll(inputsAndTasks.Select(i=>i.OutputTask));
var results=新列表();
foreach(inputsAndTasks中的变量x)
{
输出=等待x.输出任务;
结果。添加((x.输入,输出));
}
由于您已经知道所有单独的输出任务都已完成,因此在第二个循环中执行wait
将立即返回结果。有一种替代方法,通过利用“AsParell”避免完全使用任务
IList输入=新列表();
//在此处填充输入
IDictionary associations=新字典();
associations.AddRange(inputs.AsParallel()
.选择(异步i=>
{输出o=等待进程(i);
返回新的KeyValuePair(i,o);
}));
var results=inputs.aspallel().Select(input=>{Output-Output=wait-Process(input);return(input,Output);}.ToList()代码>
IList<Input> inputs = new List<Input>();
// populate inputs here
IDictionary<Input, Output> associations = new Dictionary<Input, Output>();
associations.AddRange(inputs.AsParallel()
.Select(async i =>
{ Output o = await Process(i);
return new KeyValuePair<Input, Output>(i, o);
}));