使用私有方法调用的并行ForEach查询

时间:2017-06-01 18:43:50

标签: c# multithreading parallel.foreach

任何人都可以告诉我以下代码是否在C#中是线程安全的:

ConcurrentBag cb = new ConcurrentBag();
Parallel.ForEach(someCollection, (param1) => 
{`
    `cb.Add(GetOutput(param1));
});

private SomeClass GetOutput(InputParameter param1)
{
    SomeClass someClassInstance = null;
    //declare local variables;

    //call an external service;
    return someClassInstance;
}

迭代之间没有共享状态,迭代是独立的。 我怀疑是GetOutput私有方法和在其中声明的局部变量。它们是否会为每个线程单独分配? 我99.99%肯定他们会,但想寻求专家意见。

由于

维卡斯

2 个答案:

答案 0 :(得分:1)

是的,无论并发线程是否正在调用该方法,都将为每次调用分配在方法范围内声明的任何变量。

答案 1 :(得分:1)

  

我怀疑是GetOutput私有方法和在其中声明的局部变量。它们是否会为每个线程单独分配?

GetOutput方法的每次调用都将始终获得自己独立的局部变量。局部变量仍然可以引用到另一个线程可以同时使用的对象。但只要您的数据是本地的,该方法就是线程安全的。

有关此问题的详情,请参阅以下类似问题的答案。

Are local variables threadsafe?