Обновление приложения 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 формы, а в обработчике проверить, не свернута ли форма...

Другие вопросы по тегам