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