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

标签 c# multithreading thread-safety parallel-processing

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

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/

相关文章:

java - 我哪里不是线程安全的?

c# - 动态创建表单和容器

java - 为什么异步线程不能同时修改 ArrayList?

java - 使用 for 循环的函数并行化

c - 我怎么知道 linux 系统调用是否线程安全?

multithreading - 应用服务器如何支持多线程?

c# - 我们能否在 C# 应用程序中创建 300,000 个线程并在 PC 上运行它?

c# - 如何在 Visio C# 中编写 Shape 的属性?

c# - 检查是否存在然后插入 SortedList 的快速方法

java - 线程 "something thread"java.lang.OutOfMemoryError : Java heap space. 中的异常我该怎么办?