我正在寻找有关 SharePoint 和线程安全的文章、论坛或博客文章?我很确定在使用 SharePoint 对象模型时必须考虑有关线程安全的一些特殊方面。
其实我还没有找到很多关于这方面的信息。
所以我很期待你的回答。
再见,弗洛
我正在寻找有关 SharePoint 和线程安全的文章、论坛或博客文章?我很确定在使用 SharePoint 对象模型时必须考虑有关线程安全的一些特殊方面。
其实我还没有找到很多关于这方面的信息。
所以我很期待你的回答。
再见,弗洛
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
我经常遇到一个问题:在编写自己的列表项接收器时,您需要注意一些事件是异步触发的,例如ItemAdded()
,这意味着您的代码可能同时在多个线程中运行。
因此,在进行了更多的谷歌搜索和网络搜索和测试之后,似乎在使用 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();
所以线程安全似乎是由对象模型本身处理的。当然,您必须处理由于竞争条件而可能引发的异常。