2009-07-09 34 views
6

これは一般的なASP.Netにも当てはまると思われますが、わかりません。ASP.Net MVCのスレッドセーフティー

コントローラにアクションメソッドがある場合、MyController.DoSomethingExcitingと3人のクライアントが「同じ時刻に」ヒットするか、スレッドセーフであるか、3つの同時呼び出しを確実に行う必要があるかお互いに対話しないでください?

答えて

13

このメソッドのローカル変数は、呼び出しごとになります。コントローラインスタンスがリクエストごとであると仮定して(MVCを知らない)、インスタンスメンバーは安全です。

しかし、静的なメンバーや他の共有メンバーがある場合、それらは安全ではありません。

+2

コントローラーインスタンスがリクエストごとです。 – roryf

+0

コントローラーインスタンスがリクエストごとにスレッドセーフな状態になっていますか?または、同じリクエストで複数のスレッドがコントローラのインスタンスを使用する方法がありますか?私は自分のコントローラにプライベート変数を与えてスレッドセーフであることを確認したい。 – xr280xr

+1

コントローラーインスタンスのインスタンスメンバーは、私が知る限り、スレッドセーフである必要があります。しかし、コントローラが使用するすべてのリソースが実際にスレッドセーフであることを確認してください。コントローラインスタンスがリクエストごとであることを私は知らないことに注意してください。 –

2

このメソッドが独自の変数をすべてインスタンス化し、静的メンバーを使用しない場合は、すべての場合にOKである必要があります。

オブジェクトは複数のスレッドによって一度に参照され、いくつかのクラスレベルの変数を複数回読み込み、別のスレッドによって読み取り間に変更される可能性があります。

データが一度だけ読み込まれ、クラスレベルで何も書き込まれない場合は、マルチスレッドが問題になることはありません。

2

必ずしもそうではありません。 「スレッドの安全性」の意味に依存します。

例えば、「db」と呼ばれるEntity Frameworkを共有していて、それらが何らかのテーブルで動作しているとします。あなたのコントローラ "MyController"を呼び出すと、このdb.MyTableを呼び出すことができます。 各リクエストはMyControllerの別のインスタンスを呼び出します。これまでのところ、スレッドセーフです。各コントローラは、MyEntities db = new MyEntities()のインスタンスを作成します。今のところスレッドセーフです。 db.MyTableはIEnumerableタイプが<MyTable>であるため、相互作用します。彼らがデータベース内の同じエンティティ(ロックなし)、つまりdb.MyTable [0]で作業していると仮定すると、それらはお互いを上書きします( "最後に勝利を救う")。

3人のユーザーが、(データベース内の)同じ場所を指す(スタック内の)3つの独立したポインタを持ちます。スレッドの問題ではありません。それはデータロックの問題です。

+1

@ colin-desmond自分自身に質問する - 私のシステムの2人が同じリソース(同じデータエンティティなど)を実際に使用し、一緒に書き込む(更新する)ことができますか? – LongChalk