В приложении WPF у меня есть таймер, который циклически выполняет некоторые операции запроса базы данных (LINQ to SQL) и визуальные средства управления обновлением, вызывая конкретный метод.
Иногда мне нужно вызвать этот же метод с помощью событий пользовательского интерфейса (например, нажатия кнопок).
Есть ли какая-либо опасность, если вызов на основе таймера и вызов на основе событий, основанный на событии, одно и тоже происходит одновременно? Или .NET framework защищает меня от такой опасности?
Используется один метод таким образом, как это полностью нормально?
Хорошо, что делает этот метод, точно? Если он обновляет пользовательский интерфейс, вам нужно убедиться, что вы перешли к потоку пользовательского интерфейса (используя Dispatcher
) для этой части.
Используется ли метод для любого общего состояния? Если это так, снова вам нужно быть осторожным.
В принципе нет ничего опасного в том, что один метод вызывается из двух потоков одновременно... но в равной степени нет ничего, что автоматически защитило бы вас от выполнения небезопасных вещей (в терминах concurrency) внутри этого метода.
Событие таймера и клика будет выполняться на разных потоках и может одновременно выполнять этот метод. Возможно, стоит поставить синхронизацию вокруг любой критической секции внутри метода. то есть, если код вычисляет значение и т.д.