1

sharepoint プロジェクトには、非常に重要なイベント レシーバーがあります。これまで、このプロジェクトの 7 つのバージョンがクライアント用にデプロイされています。これらのバージョンの 1 つが非常に不安定で遅いことが不思議です。ランダムに発生します。

注:ネットワーク速度は良好です。問題はプロジェクトにあります。

私はコードをチェックアウトし、エラー「ファイル 'FileName' が SHAREPOINT\system によって変更されました」ItemUpdated処理する方法を見つけました。ループが発生することがあります。ItemAddedSPListItem

base.EventFiringEnabled = false;
bool tryAgain = false; //used to handle "The file has been modified by SHAREPOINT\system"
do
{
    tryAgain = false;
    try
    {
        try
        {
            if (_item.File.CheckOutType == SPFile.SPCheckOutType.Online || _item.File.CheckOutType == SPFile.SPCheckOutType.Offline)
                 {
                     try
                     {
                          _item.File.CheckIn("prevent checkout/locked error");
                     }
                     catch (Exception ex) { }
                 }
           _item.SystemUpdate(true);
        }
        catch (Exception ex)
        {
             throw ex;  //-- used to handle "The file has been modified by SHAREPOINT\system"
        }
    }
    catch (Exception ex) //-- used to handle "The file has been modified by SHAREPOINT\system"
    {
        if (ex.Message.ToLower().Contains("has been modified by"))
        {
            System.Threading.Thread.Sleep(1000 * 2);
            tryAgain = true;
        }
        else
        {
            this.HandleException(ex, "");
        }
     }
} while (tryAgain == true);

この while ループには次の状態があります。

1-item は初めて更新され、例外はありません

2-更新の原因は例外であり、数回の反復後に更新されます

3-更新の原因は前述の例外であり、ループに陥り、200回の反復後でも更新されません。

この問題により、プロジェクトが不安定になり、動作が非常に遅くなることがあります。この状況を処理する最善の方法は何ですか?

4

2 に答える 2

2

クイック検索で、elements.xml のイベント レシーバーの定義を変更して、非同期 (既定) ではなく同期で実行することについて言及している記事がいくつか見つかりました。

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="850">
      <Receiver>       
        <Synchronization>Synchronous</Synchronization>
      </Receiver>     
  </Receivers>
</Elements>

私がこれから取った記事: http://onlinecoder.blogspot.co.uk/2013/07/splistitemupdate-file-has-been-modified.html

于 2013-08-02T09:31:39.957 に答える
0

手遅れかもしれません..2017年に同じ問題に直面しています..解決策はうまくいきませんでした..私がしたことは、ItemAddedイベントレシーバーでファイルを読んでいて、それを読んだ後に新しいファイルの値に基づいて列を更新するスレッド。出来た..

于 2017-01-10T05:51:18.957 に答える