1

我知道stackoverflow中存在这个问题。但我的似乎不同。我看不出有什么问题。但它有时会在运行时发生。

我得到的异常: “System.Collections.Generic.List`1[System.String] GetTemplateAndPicture(System.String):索引超出范围。必须为非负数且小于集合的大小。参数名称:索引"

这是我的代码:有人可以看看并告诉我会发生什么吗?

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 个公共方法。一个用于将项目添加到列表中,另一个用于从列表中删除项目。当然不要忘记锁定 SessionDataList 的全局列表。

因此,当您需要向或表单列表添加或删除项目时,只需使用下面指定的两个公共方法。

代码片段是这样的:

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 回答