Отключить форму, когда BackgroundWorker занят? - PullRequest
7 голосов
/ 15 сентября 2009

Я не хочу, чтобы пользователь взаимодействовал с моим приложением, когда определенный фоновый работник занят (работает). Я создал этот BGW, чтобы приложение не выглядело замороженным во время работы. Но теперь пользователи могут перемещаться в приложении. Как отключить мою форму / приложение?

Спасибо!

Ответы [ 5 ]

14 голосов
/ 15 сентября 2009

Возможно установить Enabled на false?

this.Enabled = false;

Это немного радикально, поскольку также предотвращает перемещение, изменение размера или закрытие события. Лучшим подходом было бы поместить элемент управления Panel в вашу форму с Dock = Fill и поместить другие элементы управления в этот Panel. Тогда вы можете вместо этого использовать Enabled свойство Panel, чтобы предотвратить дальнейший ввод данных пользователем.

Заметьте, мысль о том, что пользователь сможет закрыть форму, так что это должно быть обработано изящно.

4 голосов
/ 15 сентября 2009

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

1 голос
/ 15 сентября 2009

Управлять отключением определенных элементов управления проще, разместив их внутри панели и отключив эту панель, чем отключая отдельные элементы управления:

controlPanel.Enabled = false;

Распространенным способом блокирования других задач, которые могут удовлетворить ваши потребности, является отображение верхней формы с индикатором выполнения. Я реализовал это в прошлом с успехом. Другие программы делают то же самое. Например, в WinRAR, когда приложение занято извлечением или сжатием файлов, приложение отображает самую верхнюю форму. Это похоже на «модальную» форму, но на самом деле вы все равно можете нажать на другие функции, на которые WinRAR спрашивает: «Вы хотите прервать текущую операцию?»

Отключение всего приложения часто не является необходимым и может быть не интуитивно понятным. Итак, спросите себя, действительно ли вам нужно заблокировать взаимодействие с формой. Например, у меня есть приложение, которое требует определенного времени для выполнения определенных задач. Я предоставляю индикатор выполнения для этой конкретной части работы, но вы все равно можете взаимодействовать с приложением, чтобы запускать дополнительные задачи, которые выполняются одновременно. Даже если я позволю вам выполнять только одну задачу за раз, вы все равно можете просмотреть файл справки или установить настройки приложения во время выполнения задачи. Кроме того, я даю пользователю кнопку, которая позволяет им остановить задачу. Отключение формы предотвратит этот тип взаимодействия.

1 голос
/ 15 сентября 2009

Я согласен с @ michael-todd в его комментарии выше, отключив отдельные элементы управления / кнопки навигации / и т.д. в то время как фоновый рабочий работает, кажется довольно хорошим решением. Это дало бы вам детальный контроль над тем, что пользователь может делать во время конкретной фоновой операции.

Вы могли бы:

  1. Создание методов для включения или отключения всех соответствующих элементов управления навигации / взаимодействия (путем задания для их свойства Enabled значения true / false и т. Д. В зависимости от каждого элемента управления)
  2. Вызовите метод «Отключить» из своего кода прямо перед вызовом StartWorkerAsync () для фонового работника
  3. В обработчике событий для RunWorkerCompleted вызовите метод «Включить», чтобы снова включить представление для пользовательского ввода
0 голосов
/ 15 сентября 2009

Другим возможным способом может быть «отфильтровать» все входные данные для приложения. Это можно сделать, прослушав «KeyDown» и «MouseButtonDown». После запуска фонового задания вы можете установить для флага FILTER_INPUT значение true и сбросить его после завершения. Если установлен флаг FILTER_INPUT, то можно отменить все события Key и Mouse.

Это может быть не самым эффективным, так как все нажатия клавиш и нажатий пройдут через проверку фильтра.

...