Windows.Формы.Таймеры тикают и нажимают кнопку одновременно в c#

#c#

Вопрос:

У меня есть кнопка и окно.Формы.Таймеры таймер1. Оба они выполняют некоторые операции с базой данных. Может ли возникнуть какая-либо проблема в главном потоке, если отметка timer1 срабатывает, когда нажатие кнопки уже работает ? Каков основной ответ потока в этом случае ? Оба они работают отдельно или операция нажатия кнопки заблокирована тиком timer1 ?

Комментарии:

1. Это зависит от кода в вашем обработчике событий. Самый простой способ получить повторный доступ-это поместить Application.DoEvents где-нибудь в код обработчика событий.

2. Полностью ли операция блокирует поток пользовательского интерфейса? Как будто у тебя было Thread.Sleep() ? Значит, цикл сообщений не обрабатывает никаких сообщений? Если это не так, вызывается событие Tick и вызывается соответствующая процедура. Поэтому лучше остановить таймер, когда то же самое действие запускается где-то в другом месте. Включите снова, когда процедура вернется.

3. Уважаемый Джими , в моем приложении нет Thread.sleep (). сделал пример приложения , нажмите кнопку «Первый запуск» 1. интервал timer1=10 мс, и timer1 останавливается в конце процесса timer1. После запуска таймера 1 нажмите кнопку «Чтение данных из базы данных». Я попытался считывать данные одновременно с помощью обоих таймеров и нажатием кнопки из базы данных. Он работает правильно ! в этом нет никакой проблемы.

4. Я не говорил, что у вас есть Thread.Sleep() в коде, я спросил, блокирует ли код, который у вас есть, поток пользовательского интерфейса, как Thread.Sleep() это делает. В любом случае значение таймера 10ms слишком низкое; для запроса к базе данных это совершенно непоследовательно: вы не сможете использовать графический интерфейс. Это не может быть реальным сценарием. — Как уже упоминалось, если ваша процедура не полностью заблокирована, т. Е. поток пользовательского интерфейса может обрабатывать сообщения, таймер будет тикать, если вы его не остановите. Таймер не будет тикать только в том случае, если вы вообще не можете использовать графический интерфейс во время выполнения этой процедуры. НО то же самое будет применяться, когда таймер тикает, так что…

5. О, прости, что я неправильно тебя понял. Есть замечание о блокировке потока пользовательского интерфейса в моем приложении. Да, 10 мс слишком мало, но таймер работает только один раз, а затем останавливается. Жесткий диск-механическое устройство, и я думаю, что к нему нельзя получить доступ за 10 мс. я надеюсь на это. Поэтому я выбираю 10 мс. Сценарий заключается в том, что первый щелчок кнопки запуска и процесс нажатия кнопки начинают чтение базы данных, а также запуск таймера 1 и 10 мс спустя таймер1 начинает читать базу данных dadabase. кнопка и таймер считывают данные только один раз. Я пытаюсь понять, что происходит, если кнопка и таймер работают с базой данных одновременно или очень близко. Спасибо за ваши советы

Ответ №1:

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

Если вы выполняете какие-либо операции ожидания/асинхронности или запускаете каких-либо фоновых рабочих, то все становится немного сложнее, потому что событие timer_tick может ожидать результата от фонового потока и начать обработку события button_clicked до того, как оно вернется. Однако, если вы не реализуете потоковую передачу самостоятельно, этого не может произойти.

Комментарии:

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

2. Дорогой Спрадлин , у вас есть какие-нибудь идеи на случай. если таймер и кнопка в разных фомах.