任何人都可以告诉我以下代码是否在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%肯定他们会,但想寻求专家意见。
由于
维卡斯
答案 0 :(得分:1)
是的,无论并发线程是否正在调用该方法,都将为每次调用分配在方法范围内声明的任何变量。
答案 1 :(得分:1)
我怀疑是GetOutput私有方法和在其中声明的局部变量。它们是否会为每个线程单独分配?
是
GetOutput
方法的每次调用都将始终获得自己独立的局部变量。局部变量仍然可以引用到另一个线程可以同时使用的对象。但只要您的数据是本地的,该方法就是线程安全的。
有关此问题的详情,请参阅以下类似问题的答案。