#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. Дорогой Спрадлин , у вас есть какие-нибудь идеи на случай. если таймер и кнопка в разных фомах.