本质上,我正在处理这个:
var data = input.AsParallel();
List<String> output = new List<String>();
Parallel.ForEach<String>(data, line => {
String outputLine = "";
// ** Do something with "line" and store result in "outputLine" **
// Additionally, there are some this.Invoke statements for updating UI
output.Add(outputLine);
});
输入是一个List<String>
目的。这ForEach()
语句对每个值进行一些处理,更新 UI,并将结果添加到output
List
。这有什么本质上的错误吗?
Notes:
Update:
根据我收到的反馈,我添加了一本手册lock
to the output.Add
语句以及 UI 更新代码。
Yes; List<T>
不是线程安全的,因此从任意线程(很可能同时)临时添加它是注定的。您应该使用线程安全列表,或者手动添加锁定。或者也许有一个Parallel.ToList
.
另外,如果重要的话:将不保证插入顺序。
这个版本is不过安全:
var output = new string[data.Count];
Parallel.ForEach<String>(data, (line,state,index) =>
{
String outputLine = index.ToString();
// ** Do something with "line" and store result in "outputLine" **
// Additionally, there are some this.Invoke statements for updating UI
output[index] = outputLine;
});
这里我们使用的是index
每次并行调用更新不同的数组索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)