C# 反转控制容器和线程/Parallel.ForEach

C# 反转控制容器和线程/Parallel.ForEach,c#,.net,multithreading,inversion-of-control,ninject,C#,.net,Multithreading,Inversion Of Control,Ninject,如果我有一个名为WidgetProcessor的服务(服务层对象而不是web服务),并且该服务在该方法中只有一个名为Process()的方法,那么我将使用另一个服务(服务层对象)。让我们调用这个服务WidgetValidator,它有一个从Parallel.ForEach中调用的Validate()方法 1) 我假设如果我什么都不做,验证方法,如果它执行多个计算,它将不会是线程安全的。。。正确吗? 2) 注入WidgetValidator对象的正确方法是什么。如果我通过构造函数将WidgetVa

如果我有一个名为WidgetProcessor的服务(服务层对象而不是web服务),并且该服务在该方法中只有一个名为Process()的方法,那么我将使用另一个服务(服务层对象)。让我们调用这个服务WidgetValidator,它有一个从Parallel.ForEach中调用的Validate()方法

1) 我假设如果我什么都不做,验证方法,如果它执行多个计算,它将不会是线程安全的。。。正确吗?
2) 注入WidgetValidator对象的正确方法是什么。如果我通过构造函数将WidgetValidator注入,并将其分配给类级别的私有变量,那么线程安全性似乎会降低。。。与新的在Parallel.ForEach中安装WidgetValidator相比。但这一切让我想到了“代码气味”!我应该在Validate方法中对代码应用锁吗


注意:我使用Ninject作为IoC容器。

这取决于验证器是否正在改变共享状态。如果不是,则可以重用同一实例。如果它正在变异共享变量,则不能同时调用它。

这取决于验证程序是否在变异共享状态。如果不是,则可以重用同一实例。如果它正在改变共享变量,您不能同时调用它。

它可能会改变方法局部变量。每个线程都有自己的局部变量吗。对不起,我已经有一段时间没有做过线程了+1永远不会共享本地变量(如果需要,CLR甚至不提供安全的代码方式)。这是安全的,酷。正在和Ninject一起完成DDD项目。。。而且很长一段时间没有一个项目需要处理线程。谢谢-usr-answeredIt可能会更改方法局部变量。每个线程都有自己的局部变量吗。对不起,我已经有一段时间没有做过线程了+1永远不会共享本地变量(如果需要,CLR甚至不提供安全的代码方式)。这是安全的,酷。正在和Ninject一起完成DDD项目。。。而且很长一段时间没有一个项目需要处理线程。谢谢-usr-回答