使用私有方法调用的并行 ForEach 查询
Parallel ForEach query with private method call
谁能告诉我以下代码在 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% 确定他们会,但想征求专家意见。
谢谢
维卡斯
是的,无论是否有并发线程正在调用该方法,都将为每次调用分配方法范围内声明的任何变量。
My doubt is around the GetOutput private method and the local variables declared in it. Will they be allocated separately for each thread?
是的。
GetOutput
方法的每次调用都将始终获得自己独立的局部变量。局部变量仍然可以 引用 到另一个线程可能同时使用的对象。但只要你的 data 是本地的,该方法就是线程安全的。
请参阅以下类似问题的答案以获取更多相关信息。
Are local variables threadsafe?
谁能告诉我以下代码在 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% 确定他们会,但想征求专家意见。
谢谢
维卡斯
是的,无论是否有并发线程正在调用该方法,都将为每次调用分配方法范围内声明的任何变量。
My doubt is around the GetOutput private method and the local variables declared in it. Will they be allocated separately for each thread?
是的。
GetOutput
方法的每次调用都将始终获得自己独立的局部变量。局部变量仍然可以 引用 到另一个线程可能同时使用的对象。但只要你的 data 是本地的,该方法就是线程安全的。
请参阅以下类似问题的答案以获取更多相关信息。
Are local variables threadsafe?