Отписаться от события после его запуска - PullRequest
0 голосов
/ 20 декабря 2018

У нас есть объект, который не удаляется сборщиком мусора, и мы полагаем, что это происходит из-за события rouge, зарегистрированного для реконструированного объекта, который никогда не будет незарегистрированным.

Мы создали методэто работает, когда форма возвращается тоже.(Скажем, например, мы переходим от формы A к B, затем обратно к A. Метод будет работать на обратно к A ).В этом методе мы проверяем, возвращаемся ли мы из формы B. Если мы затем создаем экземпляр этой формы и прикрепляем событие к .FormClosed.

Этот код был получен от одного из наших партнеров.поэтому я не знаю причину, по которой они решили присоединить событие .FormClosed, когда контекст события, к которому оно присоединено, должен быть, когда он уже закрыт.(Отсюда обратно к A ).

Чего я не знаю, так это как отсоединиться от события .FormClosed, но при этом сохранить логику, которая там срабатывает?

Основой кода является:

private void Returning(object sender, EventArgs e)
{
    CoreForm frmSomeChildForm = sender as CoreForm

    if (frmSomeChildForm.Name == "frmB") // We are 'returning' from B
    {
        // Do stuff
        frmSomeChildForm.FormClosed += new FormClosedEventHandler(SomeMethod);
    }
}

private void SomeMethod(object sender, FormClosedEventArgs e)
{
    // This was in the comments for the method:
    // Event added to re-position the search panel back to the top by removing
    //the other two panels and adding them back to the form.
    // The code just calls parent methods of DLLs we don't have the source for.
}

Поскольку метод Returning в основном вызывается, когда мы возвращаемся из формы B, имеет ли какой-то смысл, почему мы присоединяем .FormClosedсобытие там?Разве я не могу сделать что-то подобное?

private void Returning(object sender, EventArgs e)
{
    CoreForm frmSomeChildForm = sender as CoreForm

    if (frmSomeChildForm.Name == "frmB") // We are 'returning' from B
    {
        // Do stuff

        SomeMethod();
    }
}

РЕДАКТИРОВАТЬ:

Итак, Returning запускается в форме, которую мы возвращаем из события FormClosed().Таким образом, форма, из которой мы возвращаемся, уже должна быть закрыта.

Цель SomeMethod не совсем ясна, но, похоже, она связана с сбросом отображения пары элементов управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...