Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 垃圾处理_C#_Sharepoint_Dispose_Spsite - Fatal编程技术网

C# 垃圾处理

C# 垃圾处理,c#,sharepoint,dispose,spsite,C#,Sharepoint,Dispose,Spsite,我的场景是在一个SPJobDefinition的Execute方法中,我希望遍历web应用程序中的每个SPSite。因此,我有以下代码: foreach (SPSite site in this.WebApplication.Sites) { ... } 问题是,我是否需要处理每个站点?我通常遵循的规则是,只有在我自己重新安装的情况下,才能将其处置或放入一个容器中。Sites属性实际上是否包含完全构造的site对象,我在这段代码中只会引用这些对象。如果是这样,那么处置这些站点将是危险的,因

我的场景是在一个SPJobDefinition的Execute方法中,我希望遍历web应用程序中的每个SPSite。因此,我有以下代码:

foreach (SPSite site in this.WebApplication.Sites)
{
  ...
}
问题是,我是否需要处理每个站点?我通常遵循的规则是,只有在我自己重新安装的情况下,才能将其处置或放入一个容器中。Sites属性实际上是否包含完全构造的site对象,我在这段代码中只会引用这些对象。如果是这样,那么处置这些站点将是危险的,因为我正在修改另一个可能需要它们的对象。或者相反,Sites属性是否根据请求构造对象。。在这种情况下,我有责任处理它们吗

另外,如果我确实需要这样做,我该如何处置它们。在这种情况下,我不能使用using,在foreach中调用dispose会破坏枚举吗?

是的。请参阅中的“编写可扩展到大量用户的应用程序”。正确的模式是:

foreach (SPSite site in this.WebApplication.Sites)
{
  try
  {
    ...
  }
  finally
  {
    site.Dispose();
  }
}
调用dispose不会中断枚举。它只是清理对象使用的非托管内存。

此处的指南

暗示

//loop through each sub site
for (int i = 0; i <= rootweb.Webs.Count; i++)
{
  using (SPWeb subweb = rootweb.Webs[i])
  {
    //do stuff
  }
}
//遍历每个子站点

对于(int i=0;i看这里-

我问过关于打破枚举的问题,因为我遇到过这样的问题:从您当前使用foreach枚举的列表中删除某些内容会引发异常。我只是不知道是否在这里也适用。如果我在WebApplication中创建站点的副本,这是有意义的。然后,站点将t不会修改枚举正在运行的集合。我更愿意将此处理逻辑封装到AsSafeEnumerable()扩展方法中:此方法包含在SPExLib中:link现在已失效,因此正确的链接已被删除