Могу ли я использовать компонент таймера в форме WinForms для проверки состояния переключателей и включения / выключения кнопки? - PullRequest
2 голосов
/ 07 февраля 2012

У моего небольшого окна в форме приложения есть две кнопки-переключателя, и изначально ни одна из них не отмечена.Пока один из них не проверен, кнопка «Перейти» должна быть отключена.

Я нашел очень простой способ получить это, но я не уверен, настраиваю ли я себя на случайный сбой.

Я добавил компонент таймера, включил его и в событии Tick:

private void timer1_Tick(object sender, EventArgs e)
{
    bool canGo = (_usRadioButton.Checked || _intlRadioButton.Checked);
    if (_goButton.Enabled != canGo)
    {
        _goButton.Enabled = canGo;
    }
}

Я знаю, что есть другие способы сделать это, мне просто любопытно, если этот способ действителенили если у меня будет конечный пользователь, выдающий исключения, когда таймер срабатывает одновременно, форма обновляет свойство Checked на одном из флажков?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Если я вас правильно понял, вы уже знаете о событии CheckedChanged и спрашиваете только о конфликтах в вашем коде. Итак:

Насколько я знаю, это не многопоточность, и опасности нет. Событие Tick фактически не сработает, когда компьютер обновляет состояние Checked.

Если вы размещаете трассы в Form.Load и Timer.Tick:

private void Form_Load(object sender, EventArgs e)
{ 
    Console.WriteLine("Form_Load/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId);
}

private void timer1_Tick(object sender, EventArgs e)
{
     Console.WriteLine("timer1_Tick/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId);
}

Результаты показывают:

Form_Load/Thread.CurrentThread.ManagedThreadId=9
timer1_Tick/Thread.CurrentThread.ManagedThreadId=9
2 голосов
/ 07 февраля 2012

Лучшее решение - подписаться на событие CheckedChanged ваших радиокнопок, а затем включить кнопку «Перейти» в этом обработчике событий.

Это решит любые проблемы с синхронизацией, с которыми вы столкнетесь при таком подходе.

1 голос
/ 07 февраля 2012

Я не уверен, что это безопаснее, но вы также можете подписаться на событие CheckedChanged и использовать этот код обработчика для включения кнопки «Перейти». Это сэкономит вам таймер, который будет работать бесконечно.

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