Почему для моих элементов управления C # значение IsDisposed установлено в true без срабатывания метода Dispose - PullRequest
0 голосов
/ 09 декабря 2010

Это скребок для головы.У меня есть форма с несколькими пользовательскими элементами управления.Первый раз, когда я создаю экземпляр этого все работает нормально.

Проблема возникает, когда я закрываю форму, а затем создаю второй экземпляр.Некоторые из моих элементов управления имеют событие, которое (условно) вызывается при наведении курсора мыши.В OnMouseOver() непосредственно перед повышением MyEvent все нормально, но в данный момент я ввожу MyControl_MyEvent, метод IsDisposed имеет значение true на форме и всех ее дочерних элементах управления.Это происходит несмотря на то, что точки останова в методе Dispose формы и элементов управления никогда не срабатывают.

Ход событий, которые я описал выше, не уникален;Я могу вызвать ту же ошибку в нескольких других местах, но не пролистал через стек вызовов достаточно подробно, пытаясь найти точно, где IsDisposed установлено в true.

    //MyConrol
    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        if (conditions)
        {
            if (MyEvent != null)
                MyEvent(this, new EventArgs());  //nothing disposed here
        }
    }

    //the first of several classes that have sbuscribed to the event
    void MyControl_MyEvent(object sender, EventArgs e)
    {
        //IsDisposed = true here if this is the second time the form has been displayed.
        DoStuff();  
    }


    protected override void Dispose(bool disposing)
    {   //the breakpoint here is never triggered
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

Может кто-нибудь предложитькак я могу понять, что происходит?

1 Ответ

4 голосов
/ 09 декабря 2010

Вы, вероятно, забыли отписаться от событий, когда форма закрыта.

Поэтому, когда вторая форма открыта, каждое событие будет обрабатываться дважды - один раз первой формой (которая удаляется) иодин за другим (что не так).

В качестве средства отладки вы можете щелкнуть правой кнопкой мыши на this в окне Locals и нажать Make Object ID, чтобы увидеть, на какой экземпляр вы смотрите.

...