gpt4 book ai didi

c# - 使用 Parallel.ForEach() 线程安全吗?

转载 作者:IT王子 更新时间:2023-10-29 04:33:12 25 4
gpt4 key购买 nike

本质上,我正在处理这个:

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 .这有什么本质上的错误吗?

注意事项:

  • 输出顺序不重要

更新:

根据我收到的反馈,我添加了手册 lockoutput.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com