C# 异步解析多个字符串

C# 异步解析多个字符串,c#,asynchronous,C#,Asynchronous,假设我将文件的内容分为 List<string> contents 我试过这样的方法: async Task<string> Parse(string content) { //dosth } List<Task<string>> tasks = contents.Select(x=> Parse(x)); var result = contents.AsParallel().Select(Parse).Aggregate((x, y

假设我将文件的内容分为

List<string> contents
我试过这样的方法:

async Task<string> Parse(string content)
{
 //dosth
}

List<Task<string>> tasks = contents.Select(x=> Parse(x));
var result = contents.AsParallel().Select(Parse).Aggregate((x, y) => x + y);
但这是不允许的


如何做到这一点?

这不是异步问题。使用并行类或PLInq:

 var results = contents.AsParallel().Select(c => /* some sync code here */);

使用并行类,例如,可以将简单for循环并行化为:

        List<string> contents = new List<string>();
        contents.Add("55");
        contents.Add("some text");
        contents.Add("a lone 5");

        ConcurrentDictionary<int, string> concurrent = new ConcurrentDictionary<int, string>();

        Parallel.For(0, contents.Count, i => concurrent[i] = Parse(contents[i]));

        foreach(string s in concurrent.Values)
        {
            Console.WriteLine(s);
        }

正如另一个答案所指出的,您可能想要使用PLINQ。假设您有一个函数:

string Parse(string str) { }
您可以像这样解析和组合字符串:

async Task<string> Parse(string content)
{
 //dosth
}

List<Task<string>> tasks = contents.Select(x=> Parse(x));
var result = contents.AsParallel().Select(Parse).Aggregate((x, y) => x + y);

这将使用
Select
通过解析函数映射字符串,并使用
Aggregate
通过串联将它们组合成一个字符串。

如果您有
async Task Parse()
为什么不
等待
它呢?
并行
类在这方面比
异步/等待
好得多。解析通常不是IO绑定的操作。首先,您不希望将其设置为
async
。您可能正在考虑。为什么要尝试通过引用传递字符串?只需将解析后的值包含在返回的任务中(或者如果它不是异步的,则与方法的返回值一样)。重要的是要认识到,如果并行解析字符串,则无法控制解析字符串的顺序。如果顺序重要,则可能导致不一致和不可预测的结果。这并不意味着你不能并行处理它们。您只需要一种机制来确保将原始序列传递给每个操作和结果,以便在完成后可以将它们放回正确的序列中。不,这将中断,因为
parsed.Add()
不是线程安全的。这是一个很好的观点;您可以(应该)改用并发集合。我已经编辑了代码。
var result = contents.AsParallel().Select(Parse).Aggregate((x, y) => x + y);