Application.Idle значимость события - PullRequest
9 голосов
/ 24 марта 2011

Что мне известно о событии Application.Idle, так это то, что приложение завершает свою обработку и собирается перейти в состояние ожидания.

Я где-то читал, что

Если у вас есть задачи, которые необходимо выполнить, прежде чем поток станет свободным, присоедините их к этому событию

Так же, как этоозначает, что задачи будут выполнены до того, как поток станет бездействующим или после того, как поток станет бездействующим?

У меня есть немного кода в моем проекте, показанном ниже.Обновление базы данных выполняется во время простоя?

private void Application_Idle(object sender, EventArgs e)
{
    // Update the explorer's menuitems
    team.UpdateMenu();

    // Update display toolbars.
    team.UpdateToolBar();

    // Update SaveAll
    SaveAll.Enabled = teaj.IsModified;

    Up.Enabled = team.CanNavigateUp;
    ...

1 Ответ

22 голосов
/ 24 марта 2011

Во-первых, следует понимать, что Application.Idle имеет значение не о «потоке бездействия», а об обработке сообщений в потоке пользовательского интерфейса приложения.(Режим ожидания потока отличается от режима ожидания цикла сообщений)

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

Событие Application.Idle стало удобным местом для асинхронной работы по ведению домашнего хозяйства приложения с основными операциями приложения и без участия нескольких потоков.

Меню и кнопки обычно включаются или отключаются, чтобы соответствовать их соответствующим состояниям команд, например, когда приложение бездействует.Поскольку видимый внешний вид необходимо обновлять только во время пользователя (пользователь не может различить разницу между изменениями визуального состояния точно во время внутренних изменений состояния по сравнению с изменением визуального состояния через несколько миллисекунд), событие простоя приложенияпростая и эффективная возможность позаботиться о такой работе по дому.

Вы можете поместить код в приложение вашего приложения Winforms.Idle для проверки базы данных или сетевого ресурса.Однако вы должны быть осторожны, чтобы не делать ничего, что занимает «много времени», потому что если вы заблокируете Application.Idle, весь пользовательский интерфейс приложения зависнет.Используйте асинхронные вызовы вместо блокировки вызовов.

Кроме того, имейте в виду, что скорость, с которой запускается событие Application.Idle, сильно варьируется - он может запускаться несколько раз в секунду или не срабатывать в течение нескольких секунд,в зависимости от того, что делает пользователь и ваше приложение.Если вы хотите регулярно проверять обновления данных, вы должны использовать событие таймера вместо Application.Idle.Если вы запускаете асинхронный сетевой запрос каждый раз, когда запускается Application.Idle, вы можете заполнить свой сервер большим количеством (избыточных) запросов в секунду.

...