C # с использованием одного метода на основе таймера и вызовов на основе событий пользовательского интерфейса

2

В приложении WPF у меня есть таймер, который циклически выполняет некоторые операции запроса базы данных (LINQ to SQL) и визуальные средства управления обновлением, вызывая конкретный метод.

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

Есть ли какая-либо опасность, если вызов на основе таймера и вызов на основе событий, основанный на событии, одно и тоже происходит одновременно? Или .NET framework защищает меня от такой опасности?

Используется один метод таким образом, как это полностью нормально?

Теги:

2 ответа

1
Лучший ответ

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

Используется ли метод для любого общего состояния? Если это так, снова вам нужно быть осторожным.

В принципе нет ничего опасного в том, что один метод вызывается из двух потоков одновременно... но в равной степени нет ничего, что автоматически защитило бы вас от выполнения небезопасных вещей (в терминах concurrency) внутри этого метода.

  • 0
    Спасибо Джон! Пожалуйста, помогите мне понять, если я использую DispatcherTimer и его обработчик события dispatcherTimer.Tick, значит ли это, что все, что делается из этого "обработчика события dispatcherTimer.Tick", выполняется в другом (новом) потоке?
  • 0
    Это не так. Вы в порядке, этот таймер может только отмечать, когда поток пользовательского интерфейса простаивает. Блокировка не требуется.
0

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

  • 0
    Замки не следует вводить «на всякий случай». Вычисление значения абсолютно нормально - если оно не касается общего состояния.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню