質問

私が持っているシナリオは、WebアプリケーションのすべてのSPSiteを調べたいSPJobDefinitionのExecuteメソッドです。次のコードがあります:

foreach (SPSite site in this.WebApplication.Sites)
{
  ...
}

質問は、各サイトを処分する必要がありますか?私が通常通り抜けるルールは、自分で新しいものにした場合にのみ、useの中に配置または配置します。そのSitesプロパティには、完全に構築されたサイトオブジェクトが実際に含まれており、このコードで参照できるようになります。もしそうなら、私はそれらを必要とするかもしれない別のオブジェクトを変更しているので、サイトを処分することは危険です。または、反対に、Sitesプロパティはリクエストに応じてオブジェクトを構築します。その場合、それらを破棄するのは私の責任ですか?

さらに、必要な場合はどうすれば処分できますか。この場合はusingを使用できません。foreach内でdisposeを呼び出すと列挙が壊れますか?

役に立ちましたか?

解決

はい。 「多数のユーザーに対応するアプリケーションの作成」をご覧ください。 ベストプラクティス:SharePointオブジェクトモデル使用時の一般的なコーディングの問題 。正しいパターンは次のとおりです。

foreach (SPSite site in this.WebApplication.Sites)
{
  try
  {
    ...
  }
  finally
  {
    site.Dispose();
  }
}

disposeを呼び出しても、列挙は中断されません。オブジェクトが使用するアンマネージメモリをクリーンアップするだけです。

他のヒント

こちらのガイダンス 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top