我知道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;
}
答案 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
}
}
希望得到这个帮助。