2012-05-03 3 views
1

Если у меня есть служба (объект сервисного уровня, а не веб-сервис), называемый WidgetProcessor, и эта служба имеет только один метод с именем Process(). В рамках этого метода я использую другую услугу (service- слой). Назовем эту службу WidgetValidator, она имеет метод Validate(), который вызывается из Parallel.ForEach.Инверсия контейнеров управления и Threading/Parallel.ForEach

1) Я предполагаю, что я не делаю ничего, что метод Validate, если он выполняет несколько вычислений, что он не будет потокобезопасным ... правильно?
2) Каков правильный способ вставки объекта WidgetValidator. Если я введу WidgetValidator через конструктор и назначу его частной переменной уровня класса, похоже, что это будет меньше потокобезопасным ... ну, по сравнению с новичком WidgetValidator внутри Parallel.ForEach. Но что-то об этом все оставляет меня в виду «Code Smell»! Должен ли я просто применить блокировку к коду внутри метода Validate.

Примечание: Я использую Ninject в качестве контейнера IoC.

ответ

1

Это зависит от того, является ли валидатор измененным общим состоянием. Если это не так, вы можете повторно использовать один и тот же экземпляр. Если он изменяет общие переменные, вы не можете вызывать его одновременно.

+0

Это может изменить локальные переменные метода. Каждый поток получает свои собственные локальные вары. Извините, прошло некоторое время с тех пор, как я сделал нитки. +1 – BuddyJoe

+0

Локальные вары никогда не используются (CLR даже не предоставляет безопасный код, чтобы сделать это, если хотите). Это безопасно. – usr

+0

Прохладный. Просто работая над некоторым проектом DDD с Ninject ... и у меня не было проекта в течение длительного времени, которому приходилось иметь дело с потоками. Спасибо - usr - ответил – BuddyJoe

Смежные вопросы