SharePointとスレッドセーフ
-
10-07-2019 - |
質問
SharePointとスレッドセーフに関する記事、フォーラム、ブログの投稿を探していますか? SharePointオブジェクトモデルを操作する際に考慮する必要があるスレッドセーフティに関するいくつかの特別な側面があると確信しています。
実際には、これに関する多くの情報はまだ見つかりませんでした。
だからあなたの答えを楽しみにしています。
はい、 Flo
解決 3
したがって、Webでさらにグーグル検索と検索を行った後、MOSSオブジェクトモデルを使用するときは常にスレッドセーフを気にする必要はないようです。および一意のインスタンス。
さらに、オブジェクトなどの例外がスローされますオブジェクトを最初に取得した場合でも、変更を保存する前にUpdate()メソッドを呼び出して(またUpdate()メソッドを呼び出して)SPWebを変更して保存しました。
次の例では、命令 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();
したがって、スレッドセーフはオブジェクトモデル自体によって処理されるようです。もちろん、競合状態が原因でスローされる可能性のある例外を処理する必要があります。
他のヒント
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パターンの落とし穴をグーグルで検索します。
-オイシン
私がよく遭遇する問題が1つあります:独自のリストアイテムレシーバーを作成するときは、一部のイベントが非同期に発生するという事実に注意する必要があります。 ItemAdded()
は、コードが同時に複数のスレッドで実行される可能性があることを意味します。