Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#并行运行任务,并将每个任务与输入关联 公共类输入 { 公共布尔参数{get;set;} 公共字符串参数二{get;set;} }_C#_Asynchronous_Parallel Processing_Task_Task Parallel Library - Fatal编程技术网

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);
                            }));