1

私はこのトピックについて数日間議論してきました。いくつかのブログをチェックし、SPDisposeChecker.exe でいくつかのテストも行いました。Dispose() をいつ呼び出す必要があるかについては、さまざまなアイデアがあるようです。たとえば、Christian Glessner によるこのブログ:

http://www.ilovesharepoint.com/2010/03/sharepoint-disposing-myths.html

SPWeb で常に Web を Dispose する必要はないと述べています。

ただし、Microsoft のベスト プラクティスでは、Openweb を破棄することをお勧めしています。http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx

次のコード ブロック (少し古く、Using ブロック内にはありません)::

       try
      {

          SPSite site = new SPSite("http://mysite.aspx");
          web = site.OpenWeb();
          site.Dispose();
          site = null;
      }
      catch (System.IO.FileNotFoundException x)
      {
          return;
      }         

SPDisposeCheck で簡単なチェックを行うと、エラーが発生します。

web = site.OpenWeb(); の行の「使い捨てタイプは破棄しません」。

しかし、次のように最終ブロックを配置すると:

  finally
      {
        if (web != null)
         web.Dispose();
      }

SPDisposeCheck は、次のエラーを返します:「メモ: Dispose は、このオブジェクトに対して呼び出されるべきではありません」

少し調べてみると、このブログで説明されているように、SPDispose にバグがあることがわかりました。

http://social.msdn.microsoft.com/Forums/is/sharepointdevelopmentlegacy/thread/3fe362b3-cc03-43e5-a076-bf37dd8175c9

そのため、私は自分の研究に満足していませんでした。もちろん、Microsoft のベスト プラクティスに従うことは良いことであり、常に Dispose() を推奨しています。しかし、処分する時期と処分しない時期については、まだ十分に満足していません。

また、「SPSite を破棄すると、「m_openedWebs」内のすべての SPWeb をループし、それぞれで Close メソッドを呼び出します」という文は正しいですか?

私のコード ブロックに戻ると、SPWeb.Dispose (finally ブロック上) が本当に必要なのでしょうか?

4

3 に答える 3

1

私はSharePointのMCSDであり、SharePointで多くのメンテナンスプログラミングを行っています。SharePoint APIに関しては、私は保守的になる傾向があります。なぜなら、SharePoint APIの進化を生き抜いて、多くの苦痛を経験してきたからです。

Web(または他のSharePoint使い捨てオブジェクト)を開いた場合は、使い終わったらすぐに破棄するのが最善の策であるというのが私のアドバイスです。SPWebが自動的に破棄される場合でも、そのオブジェクトのリソースを再利用することが最善の利益になる場合があります。サイトに1,000のWebがある場合、それらを反復処理する間、それらをすべて開いたままにしますか?おそらくそうではありません。明らかに、コンテキストオブジェクトを受け取っている場合は、それらをそのままにしておく必要があります。つまり、それらを作成していないので、実際にはあなたの責任ではありません。

SPSite.OpenWebのベストプラクティスでは、「(OpenWebによって返されるSPWeb)はSPSiteオブジェクトに格納されず、SPSiteクラスのどこにも破棄されません。このため、これらのメソッドを介して作成されたオブジェクトは破棄する必要があります。どのように追加されるかわかりませんm_openedWebs。したがって、「SPSiteを破棄すると、「m_openedWebs」内のすべてのSPWebをループし、それぞれでCloseメソッドを呼び出す」という質問に関して、これは正しいステートメントですか?」 、はい、技術的な意味では、それは正しいです。開いたすべてのサイトを含むためにm_openedWebsに依存できますか?おそらくそうではありません。したがって、finallyブロックを追加し、SPWebが正しく破棄されたことを確認します。

于 2013-02-07T20:29:54.210 に答える
0

作成していない SPSite/Web を破棄しないでください。最も顕著なSPContext.Currentのは、機能のイベント ハンドラーを実行するときに渡されたサイト/Web です。

残りの時間はすべて処分する必要がありますが、通常は a を使用するのusingが最も簡単です。

于 2013-02-07T20:17:27.360 に答える