2012-05-03 9 views
1

WidgetProcessorというサービス(サービスレイヤオブジェクトではなくWebサービス)があり、そのサービスにProcess()という名前のメソッドが1つしかない場合、そのメソッド内で別のサービスレイヤーオブジェクト)。このサービスWidgetValidatorを呼び出して、Parallel.ForEach内から呼び出されるValidate()メソッドを持っています。コントロールコンテナの逆転とスレッド/ Parallel.ForEach

1)スレッドセーフではないことを複数の計算で行う場合、Validateメソッドを何もしないと仮定しています...正しい?
2)WidgetValidatorオブジェクトを挿入する適切な方法は何ですか?コンストラクタを介してWidgetValidatorを注入し、それをクラスレベルのプライベート変数に代入すると、スレッドセーフではないようです... Parallel.ForEach内部のWidgetValidatorをnew'newと比較してみましょう。しかし、これについての何かが私に "Code Smell"を考えさせてくれます!私はちょうどValidateメソッド内のコードにロックを適用する必要があります。

注:私はIoCコンテナとしてNinjectを使用しています。

答えて

1

バリデータが変更された共有状態であるかどうかによって異なります。そうでなければ、同じインスタンスを再利用できます。共有変数を変更している場合、同時に呼び出すことはできません。

+0

メソッドローカル変数が変更されることがあります。各スレッドは独自のローカル変数を取得しますか?すみません、スレッドをしてからしばらくお待ちください。 +1 – BuddyJoe

+0

ローカル変数が共有されることはありません(CLRでは、必要な場合は、安全な方法でこれを行うことさえできません)。これは安全です。 – usr

+0

Cool。ちょうどNinjectといくつかのDDDプロジェクトを使って作業しています...そして、スレッド化に対処しなければならなかった長いプロジェクトがありませんでした。ありがとう - usr - 答えた – BuddyJoe