Как мне остановить таймеры в моих элементах управления после их очистки? - PullRequest
4 голосов
/ 16 марта 2012

У меня есть простая форма с контейнером splitview, левая часть - меню, а правая часть содержит один или несколько элементов управления.

Один из элементов управления, которые можно загрузить в RHS, содержит таймер для обновления своих данных каждые несколько секунд.

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

Мой вопрос, таким образом, как мне очистить свой контроль, когда он был удален из отображения? Какое событие / метод вызывается при очистке элемента управления?

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Вы должны вызвать соответствующий метод Dispose() на элементах управления.

Для этого можно использовать метод расширения, см. этот ответ от Ганса Пассанта.

Один из элементов управления, которые можно загрузить в RHS, содержит таймер для обновления своих данных каждые несколько секунд.

Теперь у вас может быть состояние гонки здесь.Таймер может быть вызван для обратного вызова, когда вы вызываете еще не созданный метод расширения Clear().Если ваша функция обратного вызова по таймеру потенциально может привести к повреждению данных в вашем приложении, вам придется сделать что-то вроде этого.

Timer.Stop();
Timer.Tick -= Timer_Tick(TimerCallback);
Timer.Dispose(); 

Теперь другой вопрос: возможно ли просто скрыть этиуправления?Есть ли какие-то ограничения, которые мешают вам сделать это?

1 голос
/ 16 марта 2012

Этот кусок кода должен работать

public Form1()
{
    InitializeComponent();
    UserControl cc = new UserControl();
    Panel pp = new Panel();
    pp.Controls.Add(cc);
    pp.ControlRemoved += new ControlEventHandler(pp_ControlRemoved);
    pp.Controls.Clear();
}

void pp_ControlRemoved(object sender, ControlEventArgs e)
{
    var control = sender as MyVerySpecialControl;
    if (control != null)
    {
        //stop timers or unassign events
    }
}

Буду рад ответить на любые сомнения

0 голосов
/ 17 марта 2012

Я бы использовал метод расширения, а не Clear ().И проходите через дочерние элементы управления и распоряжайтесь ими специально.Если есть определенные элементы управления, которые не имеют IDispose (но должны иметь), что вызывает это, то вы можете перехватить их специально в цикле и вызвать любой метод, который останавливает их, прежде чем уничтожить их с окончательным сбросом.

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