使用AsParallel时是否必须使用线程安全方法?

时间:2019-09-12 16:29:38

标签: c# linq

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

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

像标准AsParallel()一样使用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();
public string Convert(string value)
{
    int length = value.Length;
    string myFantasticValueConverted = "_" + value + "["+ length +"]";
    return myFantasticValueConverted;
}

2 个答案:

答案 0 :(得分:6)

  

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

是的

答案 1 :(得分:-1)

//示例代码使用ConcurrentQueue。由于结果是并行执行的,因此需要重新排序

class Program
        {
            static void Main(string[] args)
            {
                var list = new ConcurrentBag<string>();
                for (int i = 0; i <= 1000; i++)
                {
                    list.Add(i.ToString());
                }
                var result = list.AsParallel().Where(q => Convert(q) < 500).Select(x => Convert(x)).ToList();            
            }

            static int Convert(string x)
            {
                var i = 0;
                return int.TryParse(x, out i) ? i : 0;
            }
        }