我的场景是,在我想要遍历web应用程序中的每个SPSite的SPJobDefinition的Execute方法中。所以我有以下代码:
foreach (SPSite site in this.WebApplication.Sites)
{
...
}问题是,我需要处理每个站点吗?我通常遵循的规则是,只有在我自己更新的情况下,才能处理或放入一个使用中。Will该Sites属性实际上包含完全构造的site对象,我在这段代码中只会引用这些对象。如果是这样,那么处理这些站点将是危险的,因为我正在修改另一个可能需要它们的对象。或者相反的是,Sites属性是否应请求构造对象。在哪种情况下,我有责任处理掉它们?
另外,如果我确实需要这样做,我该如何处理它们。在这种情况下我不能使用using,而且在foreach中调用dispose会破坏枚举吗?
发布于 2009-06-17 16:34:42
是的你需要。请参阅Best Practices: Common Coding Issues When Using the SharePoint Object Model中的“编写可扩展到大量用户的应用程序”。正确的模式是:
foreach (SPSite site in this.WebApplication.Sites)
{
try
{
...
}
finally
{
site.Dispose();
}
}调用dispose不会中断枚举。它只是清理对象使用的非托管内存。
发布于 2009-06-18 10:28:35
此处的指导http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
这表明
//loop through each sub site
for (int i = 0; i <= rootweb.Webs.Count; i++)
{
using (SPWeb subweb = rootweb.Webs[i])
{
//do stuff
}
}是这个问题的首选解决方案。
还有一个工具,你可以在你的解决方案上运行,以检查你做的事情是否正确。http://code.msdn.microsoft.com/SPDisposeCheck
发布于 2009-06-25 23:20:24
看这里- Best Practices: Using Disposable Windows SharePoint Services Objects
https://stackoverflow.com/questions/1008099
复制相似问题