Обновление приложения Windows Forms при сворачивании
У меня есть приложение для форм Windows, где я добавляю mainloop в конструктор формы следующим образом:
Application.Idle += new EventHandler(Update);
это работает нормально - однако, моя функция обновления не вызывается, когда я минимизирую окно приложения. Что мне нужно сделать, чтобы функция обновления вызывалась также, когда окно свернуто?
3 ответа
Вы можете вызвать его из System.Threading.Timer. Либо запустите таймер, когда вы свернетесь, либо просто дайте ему поработать (с низкой частотой) и проверьте Minimized перед вызовом Update.
Редактировать на основе комментариев
Самый разумный способ сделать это - запустить Update
код из другого потока. Решения Idle-Event или Timer столкнутся с проблемами.
Но с потоком вы должны быть осторожны при прикосновении к любому элементу управления пользовательского интерфейса. Простой подход - это BackgroundWorker. Он имеет события Completed и Progress, которые выполняются потокобезопасными.
Вы можете использовать таймер, как предлагает Хенк, но просто добавьте флаг, который сигнализирует, что метод все еще обрабатывает.
Итак, установите время задержки, скажем, 50 мс, и кодируйте обработчик событий следующим образом:
private void timer1_Tick(object sender, EventArgs e)
{
if ((this.WindowState == FormWindowState.Minimized) && !_isProcessing)
{
_isProcessing = true;
// Do stuff
_isProcessing = false;
}
}
где _isProcessing
является частной логической переменной в вашей форме.
Если вы ожидаете, что операции будут занимать менее 50 мс каждая, то каким-то образом агрегируйте операции (возможно, будет подходящей очередь).
Я должен попробовать это, чтобы быть уверенным, но мое первое предположение - подключить событие Resize формы, а в обработчике проверить, не свернута ли форма...