Visual Studio вылетает!- Коллекция была изменена после создания счетчика - PullRequest
5 голосов
/ 03 сентября 2011

Эй, у меня есть UserControl, который постоянно сбивал мою Visual Studio.Итак, я запустил другой экземпляр VS и отладил другой VS, и это то, что я понял:

Collection was modified after the enumerator was instantiated.

Вот мой массив:

    private static Color[] colors = 
    {
        Color.FromArgb(155, 188, 255), //    40000
        Color.FromArgb(156, 189, 255), //    39500
        Color.FromArgb(157, 188, 255), //    39000
        Color.FromArgb(156, 189, 254), //    38500
    };

А вот мой цикл, который завершает работуbussines

    public Heater()
    {
        InitializeComponent();
        this.tarTemp = this.curTemp;
        new Thread(() => UpdateTemp(true)).Start(); 
    }

    private delegate void UpdateTempDelegate(bool loop);
    private void UpdateTemp(bool loop)
    {
        if (lblTemp.InvokeRequired)
        {
            UpdateTempDelegate del = new UpdateTempDelegate(UpdateTemp);
            lblTemp.Invoke(del, loop);
        }
        else
        {
            do
            {
                lblTemp.Text = curTemp + C;
                if (curTemp >= 0)
                {
                    int i = curTemp - 10;
                    if (i < 0)
                        i = 0;
                    if (i > colors.Length - 1)
                        i = colors.Length - 1;
                    this.BackColor = colors[i]; // I'M CRASHING !!!
                }
            } while (loop && !this.Disposing);
        }
    }

Строка, в которой происходит сбой Visual Studio Designer: this.BackColor = colors[i];

Вот изображение запущенных потоков:

Threads

Все потоки остановлены на одной и той же строке ... this.BackColor = colors[i];

Вот EventViewer журнал сбоев:

Application: devenv.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidOperationException
Stack:
   at System.ThrowHelper.ThrowInvalidOperationException(System.ExceptionResource)
   at System.Collections.Generic.SortedList`2+SortedListValueEnumerator[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()
   at Microsoft.VisualStudio.Shell.ServiceProviderHierarchy.GetService(System.Type)
   at System.ComponentModel.Design.ServiceContainer.GetService(System.Type)
   at System.ComponentModel.Design.DesignerHost.GetService(System.Type)
   at System.ComponentModel.Design.DesignerHost+Site.System.IServiceProvider.GetService(System.Type)
   at System.Windows.Forms.Control.get_AmbientPropertiesService()
   at System.Windows.Forms.Control.get_BackColor()
   at System.Windows.Forms.Control.set_BackColor(System.Drawing.Color)
   at Multiplier.Heater.UpdateTemp(Boolean)
   at Multiplier.Heater.<.ctor>b__0()
   at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()

Это самая странная вещь, с которой я столкнулсядо сих пор.Помощь должна быть оценена.

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Как вы узнали, ваш код разрушает конструктор, подавляя VS.Проблема в том, что вы запускаете поток в режиме разработки, который запускается дизайнером, выполняющим часть вашего кода во время разработки.Например, он будет запускать конструктор, событие Load, OnHandleCreated и т. Д.Это делает процесс разработки очень приятным, ваш элемент управления будет выглядеть так же, как во время выполнения.

Но это также может вызвать множество проблем.Вы должны избегать запуска кода, который может вызвать исключение, когда он выполняется в другом контексте выполнения.Классические примеры пытаются открыть файл без указания полного пути, открывая соединение dbase с сервером dbase в автономном режиме или недоступном.И, безусловно, начиная поток, InvokeRequired не будет надежно работать, так как конструктор конструирует и разрушает дескриптор собственного окна.Исправление простое:

public Heater()
{
    InitializeComponent();
    this.tarTemp = this.curTemp;
    if (!this.DesignMode) {
        new Thread(() => UpdateTemp(true)).Start(); 
    }
}

Вам нужно будет проделать дополнительную работу, этот код также не будет работать хорошо во время выполнения.Потоковый код будет бомбить, когда форма, на которой размещен пользовательский элемент управления, закрыта.Как только вы это исправите, шансы на то, что теперь он работает правильно и во время разработки, хороши.Но не надо.

0 голосов
/ 03 сентября 2011

Модифицируете ли вы коллекцию, используя любой другой код?Обычно это происходит, когда вы перечисляете коллекцию в цикле и пытаетесь изменить коллекцию.

...