【问题标题】:C# Run Tasks in parallel and associate each with inputC# 并行运行任务并将每个任务与输入相关联
【发布时间】:2019-08-08 20:57:35
【问题描述】:
public class Input
{
    public bool ParameterOne { get; set; }
    public string ParameterTwo { get; set; }
}

我有一个List<Input>,我想并行处理它,保持输入与输出相关联。我遍历这个列表来构建Tasks。

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!

我怎样才能并行运行它但保留输入与输出的关联?我不想让输入成为输出上的对象。

【问题讨论】:

  • var results = inputs.AsParallel().Select(input =&gt; { Output output = await Process(input); return (input, output); }).ToList();

标签: c# asynchronous parallel-processing task task-parallel-library


【解决方案1】:

有一种替代方法可以通过利用“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);
                            }));

【讨论】:

    【解决方案2】:

    您可以等待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 将立即返回结果。

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      相关资源
      最近更新 更多