Asp.Net Webservice“索引超出范围。必须是非负数且小于集合的大小。参数名称:index”

时间:2013-05-30 08:04:45

标签: c# web-services

我知道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;
        }

1 个答案:

答案 0 :(得分: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
  }
}

希望得到这个帮助。