C# 收集被修改;枚举操作不能在线程中执行
我真的无法找到这个错误的根源,它可能是可见的,但需要一双额外的眼睛C# 收集被修改;枚举操作不能在线程中执行,c#,error-handling,enumeration,C#,Error Handling,Enumeration,我真的无法找到这个错误的根源,它可能是可见的,但需要一双额外的眼睛 try { while (Program.Alive) { List<Session> ToDispose = new List<Session>(); List<Session> ToStop = new List<Session>(); lock (mSessions) {
try
{
while (Program.Alive)
{
List<Session> ToDispose = new List<Session>();
List<Session> ToStop = new List<Session>();
lock (mSessions)
{
lock (mSessionsToStop)
{
foreach (uint SessionId in mSessionsToStop)
{
if (mSessions.ContainsKey(SessionId))
{
ToStop.Add(mSessions[SessionId]);
}
}
mSessionsToStop.Clear();
}
foreach (Session Session in mSessions.Values)
{
if (ToStop.Contains(Session))
{
continue;
}
if (Session.Stopped)
{
if (Session.TimeStopped > 15)
{
ToDispose.Add(Session);
}
continue;
}
}
}
if (ToStop.Count > 0)
{
using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
{
foreach (Session SessionStop in ToStop)
{
SessionStop.Stop(MySqlClient);
}
}
}
foreach (Session SessionDispose in ToDispose)
{
SessionDispose.Dispose();
lock (mSessions)
{
if (mSessions.ContainsKey(SessionDispose.Id))
{
mSessions.Remove(SessionDispose.Id);
}
}
}
Thread.Sleep(70);
}
}
catch (Exception e)
{
Output.WriteLine("[ExecuteMonitor.Error] " + e.Message, OutputLevel.CriticalError);
}
试试看
{
while(Program.Alive)
{
List ToDispose=新列表();
List ToStop=新列表();
锁定(mSessions)
{
锁定(MSessionstop)
{
foreach(msessionstop中的uint SessionId)
{
if(mSessions.ContainsKey(SessionId))
{
添加(mSessions[SessionId]);
}
}
msessionstop.Clear();
}
foreach(mSessions.Values中的会话)
{
if(ToStop.Contains(会话))
{
继续;
}
如果(会话已停止)
{
如果(Session.TimeStopped>15)
{
ToDispose.Add(会话);
}
继续;
}
}
}
如果(ToStop.Count>0)
{
使用(SqlDatabaseClient MySqlClient=SqlDatabaseManager.GetClient())
{
foreach(ToStop中的会话Stop)
{
SessionStop.Stop(MySqlClient);
}
}
}
foreach(会话SessionDispose in ToDispose)
{
SessionDispose.Dispose();
锁定(mSessions)
{
if(mSessions.ContainsKey(SessionDispose.Id))
{
mSessions.Remove(SessionDispose.Id);
}
}
}
睡眠(70);
}
}
捕获(例外e)
{
Output.WriteLine(“[ExecuteMonitor.Error]”+e.Message,OutputLevel.CriticalError);
}
它在一个单独的线程中运行,我们总是会收到关于集合被修改的错误;枚举操作可能不会执行在这个代码示例中,枚举时我看不到任何编辑 您是否100%确定没有忘记锁定非局部变量
在锁外编辑
mSessions
或msessionstop
会导致您描述的异常。错误发生在哪一行?它并没有说,在底部我们捕获错误并将其输出到控制台,我们只输出消息,因此我们得到的只是。。。[ExecuteMonitor.Error]集合已修改;枚举操作可能无法执行execute@RichardWilliams:这就是为什么不只是显示ex.Message。Displayex.ToString()
@richardwillams,因此将其更改为实际显示完整堆栈跟踪,而不是丢弃有价值的调试信息,然后告诉我们。