none
SharePointオブジェクトの同時実行について RRS feed

  • 質問

  • こんにちわ

    今、SharePointオブジェクトを利用しアプリケーションを作成しています。

    テストで、ドキュメントライブラリにあるファイルの更新、権限変更、フォルダの移動を多人数で同時実行し、検証しています。

    しかし、8人同時に処理を実行すると、IISのワーカープロセスがハングアップしてしまいます。但し、常にエラーとなるわけでなく20回に1回程度の頻度で再現します。

    1人で処理を実行する場合は、何時間テストしてもIISのワーカープロセスがハングアップすることはありません。

    MSDNでSharePointオブジェクトを調べると、「この型のパブリックで静的な (Visual Basic では Shared) すべてのメンバは、スレッド セーフです。インスタンス メンバは、スレッド セーフであるとは保証されません。」とあり、マルチスレッド環境で安全であるかどうか半信半疑になっています。

    SharePointオブジェクトを利用した開発で、同時実行を考慮するさいに、気を付けないといけないことはありますでしょうか?

    どうかよろしくお願いします。

    2011年5月20日 4:54

回答

  • 調査した結果、ParentWebプロパティを持つオブジェクトを使って、特定のプロパティやメソッドを使用するとメモリリークすることがわかりました。

    例えば、SPUserのUserTokenプロパティやSPFileのDelete()メソッドを実行する処理で、SharePointの診断ログに閉じられていないSPWebまたはSPSiteがありますと記載がされました。

    SPUserのUserTokenプロパティを使用した後は、SPUserObject.ParentWeb.Dipose()とする必要があります。またSPFileのDelete()メソッドを使用した後は、SPFileObject.ParentFolder.ParentWeb.Dispose()を必要とします。

    これを実施しないと、メモリーリークが溜まっていき、IISのワーカープロセスがハングアップすることがわかりました。

    以上です。

    • 回答としてマーク tamaki9 2011年5月24日 23:22
    2011年5月24日 23:22

すべての返信

  • 調査した結果、ParentWebプロパティを持つオブジェクトを使って、特定のプロパティやメソッドを使用するとメモリリークすることがわかりました。

    例えば、SPUserのUserTokenプロパティやSPFileのDelete()メソッドを実行する処理で、SharePointの診断ログに閉じられていないSPWebまたはSPSiteがありますと記載がされました。

    SPUserのUserTokenプロパティを使用した後は、SPUserObject.ParentWeb.Dipose()とする必要があります。またSPFileのDelete()メソッドを使用した後は、SPFileObject.ParentFolder.ParentWeb.Dispose()を必要とします。

    これを実施しないと、メモリーリークが溜まっていき、IISのワーカープロセスがハングアップすることがわかりました。

    以上です。

    • 回答としてマーク tamaki9 2011年5月24日 23:22
    2011年5月24日 23:22
  • なるほど、「UserToken」はParentから取得するからDispose()が必用だということですね。
    そう考えると、SPWebだけではなく、SPSiteも関係しそうな感じですね。

    「SPFile」も下記によるとSPWebから情報を取得が必要なようなので、Dispose()が必用なのですね。

    http://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.spfile(v=office.12).aspx

     

    同じオブジェクトを使用しても、不要なパタンが有りそうな気がします。
    逆のパタンで、Dispose不要なSPWeb等があったりと、、もう少し簡易にしてほしいですねー


    Blog:http://blog.sharepointissue.com HP:http://www.piecepoint.jp/
    2011年6月4日 16:40