簡體   English   中英

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

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!

如何並行運行它但保留輸入與輸出的關聯? 我不想讓輸入成為輸出上的對象。

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

你可以只等待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將立即返回結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM