谁能告诉我以下代码是否在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 回答
是 .
每次调用
GetOutput
方法总是会获得自己独立的局部变量 . 局部变量仍然可以引用另一个线程可以同时使用的对象 . 但只要您的数据是本地数据,该方法就是线程安全的 .有关此问题的更多信息,请参阅以下类似问题中的答案 .
Are local variables threadsafe?
是的,无论并发线程是否正在调用该方法,都将为每个调用分配在该方法范围内声明的任何变量 .