使用AsParallel时是否需要使用线程安全的方法?

Gon*_*nez 3 c# linq

当我使用时AsParallel(),下一个操作在多线程中运行,因此,我在此查询中使用的方法应该是线程安全的吗?

在下一个示例中,该方法Convert(string value)不是线程安全的,而是在以Select()方式运行的中使用AsParallel()

AsParallel()像standar一样使用正确Linq吗?

注意:该Convert()方法只是一个示例,但是可以想象一个更复杂的方法,该方法在多线程环境中执行时确实需要线程安全的实现。

List<string> myNamesList = new List<string>()
{
   //Initialize with a lots of elements
}

List<string> myConvertedNameList = myNamesList.AsParallel()
                                               .Where("Any Condition")
                                               .Select(x => Convert(x)) 
                                               .ToList();
Run Code Online (Sandbox Code Playgroud)
public string Convert(string value)
{
    int length = value.Length;
    string myFantasticValueConverted = "_" + value + "["+ length +"]";
    return myFantasticValueConverted;
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

使用AsParallel时是否需要使用线程安全的方法?

是。

  • @EricJ。https://docs.microsoft.com/zh-cn/dotnet/standard/parallel-programming/how-to-create-and-execute-a-simple-plinq-query#example明确指出`ToArray`和`ToList很好。 (2认同)
  • @EricJ .:是正确的;如果所有线程都在读而没有线程在写,则在多个线程上使用列表是安全的。请注意,并非所有集合都适用!例如,假设我们使用带有链接的标准哈希来实现哈希集。合理的优化是检测是否有一条长链被频繁读取,如果是,则将“最被读取”的元素移动到列表的开头。这会使读取时数据结构的内部发生变化,因此这可能导致只读操作不是线程安全的。 (2认同)