Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 收集被修改;枚举操作不能在线程中执行_C#_Error Handling_Enumeration - Fatal编程技术网

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。Display
ex.ToString()
@richardwillams,因此将其更改为实际显示完整堆栈跟踪,而不是丢弃有价值的调试信息,然后告诉我们。