1

Web サービス アプリケーションのスレッド セーフで静的/共有メソッドを使用しますか? このメソッドは、新しいインスタンスを取得するために頻繁に呼び出されます。

例えば:

 Public Shared GetPerson(ByVal name as String,ByVal surname) as Person
    Dim p As New Person
    p.Name = name
    p.Surname = surname
    p.Addresses = GetAllAddresses(name)
    return p
End Function  

更新 1

投稿されたコードは、質問のために簡単に入力したサンプルです。GetAllAdrresses は別の型の新しいインスタンスを返すため、スレッド セーフになります。

私の懸念は、多くのリクエストが同時に行われた場合、あるリクエストの名前と別のリクエストの姓を持つ人のインスタンスを返さないことです。

4

3 に答える 3

1

GetAllAddresses が読み取りアクションのみを実行する場合、静的メソッドは完全にスレッド セーフです。スレッドを再入力するたびに独自の Person インスタンスが作成され、その参照がスタックに格納されます。

したがって、UPDATE 1 に関しては、各スレッドが新しい Person インスタンスで動作しているため、2 つの異なるスレッドが同じ person インスタンスに書き込むことはできません。

于 2012-10-02T14:38:57.523 に答える
1

がスレッドセーフである場合にのみ、スレッドセーフになりますGetAllAddresses。それ以外の場合は問題ありません。

UPDATE 1に関しては、はい、うまくいきます。あなたが説明したように混乱することは決してありません。常にオブジェクトの新しいインスタンスを作成しているため、さまざまなスレッドが互いのデータに干渉する可能性はありません。

于 2012-10-02T14:32:42.537 に答える
0

私が理解していることから、あなたは を作成new Personして自分のページに戻そうとします。

そのコードでは、スレッドセーフは実際には意味がありません。あなたが見なければならないのは、その人をデータベースに保存しようとしている瞬間です。そこで、複数回書き込むことを避けるために、スレッドセーフにする必要があります。

データベースに書き戻すときに安全にする方法は 2 つあります (新規作成または更新)。

1 つはミューテックスを使用する方法で、もう 1 つはページをロックする標準の asp.net セッションを使用する方法で、プロセス全体をスレッド セーフにします。

于 2012-10-02T14:36:27.793 に答える