2012-05-03 3 views
1

WidgetProcessor라는 서비스 (서비스 계층 개체가 아닌 웹 서비스)가 있고 해당 서비스에 Process()라는 메서드가 하나만있는 경우 해당 메서드 내에서 다른 서비스 (service- 레이어 개체). 이 서비스를 WidgetValidator라고 부르 자. Parallel.ForEach 내에서 호출되는 Validate() 메소드가있다.제어 컨테이너 반전 및 스레딩/Parallel.ForEach

1) Threads safe ...가 아닌 다중 계산을 수행하는 경우 Validate 메소드를 수행하지 않으면 가정합니다.
2) WidgetValidator 객체를 삽입하는 적절한 방법은 무엇입니까? 생성자를 통해 WidgetValidator를 삽입하고 클래스 수준의 전용 변수에 할당하면 스레드 안전성이 떨어지는 것처럼 보입니다. Parallel.ForEach 내부의 WidgetValidator를 new'ing하는 것과 비교하면 훨씬 좋습니다. 그러나 이것에 관한 무엇인가는 나에게 "Code Smell"을 생각하게한다! Validate 메서드 내부의 코드에 잠금을 적용해야합니까?

참고 : 저는 IinC 컨테이너로 Ninject를 사용하고 있습니다.

답변

1

Validator가 mutate 공유 상태인지 여부에 달려 있습니다. 그렇지 않은 경우 동일한 인스턴스를 재사용 할 수 있습니다. 공유 변수가 변경되면 동시에 호출 할 수 없습니다.

+0

메서드 로컬 변수가 변경 될 수 있습니다. 각 스레드는 자체 로컬 변수를 가져옵니다. 실례지만, 내가 스레드를 한 이후로 한동안. +1 – BuddyJoe

+0

로컬 변수는 공유되지 않습니다. CLR은 원하는 경우 안전한 코드 방법을 제공하지 않습니다. 이것은 안전합니다. – usr

+0

차가움. Ninject를 사용하여 DDD 프로젝트를 진행하고 있습니다 ... 그리고 스레딩을 다루어야했던 프로젝트를 오래 동안 가지고 있지 않았습니다. 감사합니다 - usr - 대답했습니다. – BuddyJoe