本质上,我正在处理这个:
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
.这有什么本质上的错误吗?
注意事项:
- 输出顺序不重要
更新:
根据我收到的反馈,我添加了手册 lock
到 output.Add
声明,以及 UI 更新代码。
最佳答案
是的; List<T>
不是线程安全的,因此从任意线程(很可能同时)临时添加它是注定的。您应该改用线程安全列表,或手动添加锁定。或者也许有一个 Parallel.ToList
.
此外,如果重要的话:广告顺序将无法保证。
不过,这个版本是安全的:
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
每次并行调用更新不同的数组索引。
关于c# - 使用 Parallel.ForEach() 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605422/