1

この問題がstackoverflowに存在することは知っています。しかし、私のものは違うようです。問題はありません。しかし、実行時に時々発生します。

私が得た例外: 「System.Collections.Generic.List`1 [System.String] GetTemplateAndPicture(System.String):インデックスが範囲外でした。負でなく、コレクションのサイズよりも小さい必要があります。パラメータ名:index "

ここに私のコードがあります:誰か見て、何が起こるか教えてください。

public static List<string> GetTemplateAndPicture(string sessionID) 
        {
            List<string> data = new List<string>();
            try
            {

                // get the session data from the list.
                 SessionData sData = null;
                 try
                 {
                     //sData = SessionDataList.Find(p => p.SessionID.Equals(sessionID));
                     foreach (SessionData sessiondata in SessionDataList.ToList<SessionData>())
                     {
                         if (sessiondata != null && !string.IsNullOrEmpty(sessiondata.SessionID))
                         {
                             if (sessiondata.SessionID.Equals(sessionID))
                             {
                                 sData = sessiondata;
                                 break;
                             }
                         }
                     }
                 }
                 catch (Exception ex)
                 {
                     RightPatientRemoteWebserviceLog.Debug(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "::" + System.Reflection.MethodBase.GetCurrentMethod().ToString() + ":" + ex.Message);
                 }
                // get template data from session data
                string templateData = (sData == null) ? string.Empty : sData.TemplateData;

                // get picture data from session data
                string pictureData = (sData == null) ? string.Empty : sData.PictureData;

                string errorCode = (sData == null) ? string.Empty : sData.ErrorCode;

                // remove the session data from the list. no more usage with this data.
                if (sData != null && SessionDataList.Count>0)
                SessionDataList.Remove(sData);

                // create a list for sending.

                data.Add(templateData);
                data.Add(pictureData);
                data.Add(errorCode);
                return data;
            }
            catch (Exception ex)
            {
                RightPatientRemoteWebserviceLog.Debug(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "::" + System.Reflection.MethodBase.GetCurrentMethod().ToString() + ":" + ex.Message);
            }
            return data;
        }
4

1 に答える 1

0

使用しているグローバル リストはスレッド セーフではないようです。最後のコメントで「リストオブジェクトは、他のいくつかのクライアントエンドからのデータを保持します」と言うからです。そのため、リストからアイテムを削除しようとしているときに、全員が同時にリストを変更しようとすると、クラッシュします。したがって、スレッドセーフのために、グローバルリストをプライベートとして変更し、2 つのパブリックメソッドを作成するだけです。1 つはリストにアイテムを追加するためのもので、もう 1 つはリストからアイテムを削除するためのものです。もちろん、SessionDataList であるグローバル リストをロックすることを忘れないでください。

そのため、アイテムをリストまたはフォームリストに追加または削除する必要がある場合は、以下に指定された2つのパブリックメソッドを使用してください。

コード スニペットは次のようなものです。

private static SessionDatalist<SessionData> SessionDataList=new SessionDatalist<SessionData>();

public addSessionData()
{
  lock(SessionDataList)
  {

   //add list item here to the SessionDataList
  }
}

public removeSessionData()
{
  lock(SessionDataList)
  {

     //remove item from SessionDataList
  }
}

この助けを願っています。

于 2013-06-02T11:45:22.573 に答える