C# 运行 并行任务并将每个任务与输入相关联
C# Run Tasks in parallel and associate each with input
public class Input
{
public bool ParameterOne { get; set; }
public string ParameterTwo { get; set; }
}
我有一个 List<Input>
我想并行处理,保持输入与输出相关联。我循环遍历此列表以构建 Task
s.
var results = new List<(Input, Output)>();
foreach (var input in inputs)
{
Output output = await Process(input);
results.Add((input, output));
}
但这不是并行操作。我愿意。
var inputsAndTasks = new List<(Input Input, Task<Output> OutputTask)>();
foreach (var input in inputs)
{
Task<Output> output = Process(input);
inputsAndTasks.Add((input, output));
}
Output[] results = await Task.WhenAll(inputsAndTasks.Select(i => i.OutputTask));
// results are no longer associated with their inputs!
我怎样才能 运行 同时保持输入与输出的关联?我不想让输入成为输出的对象。
您可以等待 WhenAll
然后执行循环以匹配输入和输出
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));
}
因为您已经知道所有单独的输出任务都已完成,所以在第二个循环中执行 await
将立即 return 结果。
有一种替代方法可以利用 "AsParallel"
完全避免使用任务
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);
}));
public class Input
{
public bool ParameterOne { get; set; }
public string ParameterTwo { get; set; }
}
我有一个 List<Input>
我想并行处理,保持输入与输出相关联。我循环遍历此列表以构建 Task
s.
var results = new List<(Input, Output)>();
foreach (var input in inputs)
{
Output output = await Process(input);
results.Add((input, output));
}
但这不是并行操作。我愿意。
var inputsAndTasks = new List<(Input Input, Task<Output> OutputTask)>();
foreach (var input in inputs)
{
Task<Output> output = Process(input);
inputsAndTasks.Add((input, output));
}
Output[] results = await Task.WhenAll(inputsAndTasks.Select(i => i.OutputTask));
// results are no longer associated with their inputs!
我怎样才能 运行 同时保持输入与输出的关联?我不想让输入成为输出的对象。
您可以等待 WhenAll
然后执行循环以匹配输入和输出
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));
}
因为您已经知道所有单独的输出任务都已完成,所以在第二个循环中执行 await
将立即 return 结果。
有一种替代方法可以利用 "AsParallel"
完全避免使用任务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);
}));