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 模式的陷阱。

-Oisin

于 2008-11-24T15:46:49.097 回答
2

我经常遇到一个问题:在编写自己的列表项接收器时,您需要注意一些事件是异步触发的,例如ItemAdded(),这意味着您的代码可能同时在多个线程中运行。

于 2008-11-24T15:59:42.113 回答
0

因此,在进行了更多的谷歌搜索和网络搜索和测试之后,似乎在使用 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();

所以线程安全似乎是由对象模型本身处理的。当然,您必须处理由于竞争条件而可能引发的异常。

于 2008-12-04T18:14:10.170 回答