2

SharePoint とスレッド セーフに関する記事、フォーラム、またはブログ投稿を探していますか? SharePoint オブジェクト モデルを使用する際に考慮しなければならない、スレッド セーフに関するいくつかの特別な側面があることは確かです。

実際、これについてはまだ多くの情報が見つかりませんでした。

ですから、あなたの答えを楽しみにしています。

さようなら、フロー

4

3 に答える 3

7

SharePoint OMには、単なる古いスレッドセーフよりもはるかに悪い落とし穴があります。プロパティから取得したオブジェクトの操作には特に注意してください。オブジェクトで作業している間は、常にオブジェクトへのポインタを保持する必要があります。例:

var list = web.List["MyList"]
list.Items[0]["Field1"] = "foo"
list.Items[0]["Field2"] = "bar"
list.Items[0].Update() // nothing is updated!

Field1とField2は、最後のUpdate()呼び出しによって更新されると期待するかもしれませんが、違います。インデクサーを使用するたびに、SPListItemへの新しい参照が返されます。

正しい方法:

SPListItem item = list.Items[0]
item["Field1"] = "foo"
item["Field2"] = "bar"
item.Update() // updated!

ほんの始まりです。また、IDisposabe/Disposeパターンに関する落とし穴をグーグルで検索してください。

-オシーン

于 2008-11-24T15:46:49.097 に答える
2

私がよく遭遇する問題が 1 つあります。独自のリスト アイテム レシーバーを作成する場合、一部のイベントが非同期で発生するという事実に注意する必要があります。たとえば、コードが同時に複数のスレッドで実行される可能性があることItemAdded()を意味します。

于 2008-11-24T15:59:42.113 に答える
0

したがって、Web でさらにグーグル検索と検索を行ってテストした後、MOSS オブジェクト モデルを使用する場合は、常に非静的で一意のインスタンスを使用しているため、スレッド セーフをそれほど気にする必要はないように思われます。 .

さらに、SPWeb などのオブジェクトが変更され、変更を保存する前に Update() メソッドを呼び出して保存された (Update() メソッドも呼び出した) 場合、最初にオブジェクトを取得したにもかかわらず、例外がスローされます。

次の例ではweb11.Update()、オブジェクト web12 を介して表される SPWeb がその間に変更されたことを示す例外が命令によってスローされます。

SPSite siteCol1 = new SPSite("http://localhost");      

SPWeb web11 = siteCol1.OpenWeb();
SPWeb web12 = siteCol1.OpenWeb();                               

web12.Title = "web12";
web12.Update();

web11.Title = "web11";
web11.Update();

そのため、スレッドセーフはオブジェクト モデル自体によって処理されているようです。もちろん、競合状態が原因でスローされる可能性のある例外を処理する必要があります。

于 2008-12-04T18:14:10.170 に答える