Отключите форму, в то время как BackgroundWorker занят?

Я отформатировал бы как это:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) 
                    column4 
                FROM 
                    table2 
                    INNER JOIN table3 ON table2.column1 = table3.column1)

или как это:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) column4 
                FROM table2 
                INNER JOIN table3 ON table2.column1 = table3.column1)
7
задан Chris 15 September 2009 в 17:13
поделиться

5 ответов

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

this.Enabled = false;

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

14
ответ дан 6 December 2019 в 09:20
поделиться

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

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

0
ответ дан 6 December 2019 в 09:20
поделиться

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

controlPanel.Enabled = false;

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

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

вы по-прежнему можете просмотреть файл справки или настроить параметры приложения во время выполнения задачи. Кроме того, я даю пользователю кнопку, позволяющую остановить задачу. Отключение формы предотвратит этот тип взаимодействия.

вы по-прежнему можете просмотреть файл справки или настроить параметры приложения во время выполнения задачи. Кроме того, я даю пользователю кнопку, позволяющую остановить задачу. Отключение формы предотвратит этот тип взаимодействия.

1
ответ дан 6 December 2019 в 09:20
поделиться

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

Вы можете:

  1. Создавать методы для включения или отключения всех соответствующих элементов управления навигацией / взаимодействием (установив для их свойства Enabled значение true / false и т. д. в зависимости от каждого элемента управления)
  2. Вызовите метод «Disable» из своего кода прямо перед вызовом StartWorkerAsync () на фоновом рабочем сервере
  3. В обработчике событий для RunWorkerCompleted вызовите метод «Enable», чтобы повторно включить представление для пользовательского ввода
1
ответ дан 6 December 2019 в 09:20
поделиться

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

4
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: