-2

このエラーの真相を突き止めることはできません。おそらく表示されますが、追加の目が必要です!

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);
}

別のスレッドで実行され、コレクションが変更されたことに関するエラーが常に発生します。列挙操作が実行されない可能性があります

4

1 に答える 1

1

このコード例で列挙している間、編集は見られません。

lock非ローカル変数を忘れていないことを 100% 確信していますか?

編集mSessionsまたはmSessionsToStopロックの外側では、説明した例外が発生します。

于 2013-01-04T18:57:02.870 に答える