Мнение об опыте пользователя - C # Winforms - PullRequest
2 голосов
/ 24 августа 2011

У меня есть процесс, который займет чуть менее 5 секунд.Скорее всего, пользователь заметит мерцание программы в течение нескольких секунд после нажатия кнопки «Перейти».

Мой вопрос:

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

К вашему сведению: процесс открывает указанный пользователем файл excel, обрабатывает неизвестное количество строк (максимум 1,5 миллиона из-за превосходства, как я полагаю) и запрашивает базу данных (очень быстрый запрос).Таким образом, в худшем случае пользователь загружает файл Excel с 1,5 миллионами строк и работает на очень медленном интернет-соединении.

Ответы [ 8 ]

2 голосов
/ 24 августа 2011

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

Если вы хотите, чтобы пользователь мог выполнять другие задачи во время загрузки файла, поместите его в другой поток.

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

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

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

Если нет никакого вреда в разрешении взаимодействия с пользователем во время процесса, поместите его в другой поток.

Редактировать

На самом деле, читая комментарии @UrbanEsc и @ archer, я с ними согласен. Тем не менее поместите его в другой поток и заморозьте элементы управления (и, если возможно, включите индикатор прогресса).

1 голос
/ 24 августа 2011

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

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

Например, в настоящее время я модифицирую собственное приложение, в котором есть 3 пользователя. В таком случае с песочными часами все в порядке: все трое быстро узнают, что им просто нужно подождать. Не поймите меня неправильно: это приложение чертовски важно. Без этого маленькая компания, которая его использует, просто умрет. Но если я попрошу у них 2 часа дополнительного бюджета на хороший и проверенный маленький графический интерфейс, фоновый поток, бла против песочных часов, как вы думаете, что они скажут?

С другой стороны, если это важная операция в вашем флагманском продукте, конечно, будьте добры к своим пользователям! Не стесняйтесь: фоновая тема. Особенно, если операция может занять гораздо больше времени, чем эти 5 секунд.

Вывод: будьте прагматичны!

1 голос
/ 24 августа 2011

С точки зрения взаимодействия с пользователем, может быть лучше передать задание другому потоку или асинхронному рабочему и сообщить пользователю, что его запрос обрабатывается в фоновом режиме. Как только работник заканчивает работу, сообщение об успехе / неудаче может быть обработано и показано пользователю по мере необходимости.

1 голос
/ 24 августа 2011

Я бы подтолкнул это к фоновому работнику. Это сделает интерфейс пользователя отзывчивым. Если процесс задерживается более чем на несколько секунд, пользователи начинают нервничать ... особенно, когда процесс задержки вызывает «зависание» пользовательского интерфейса.

0 голосов
/ 24 августа 2011

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

Для подобных операций, которые могут занять больше времени в зависимости от среды (количество приложений, доступная память, размер данных, скорость жесткого диска и т. Д.), Их ВСЕГДА следует помещать в фоновый поток и передавать сообщения обратно в пользовательский интерфейс. Я люблю BackGroundWorker для этого.

0 голосов
/ 24 августа 2011

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

Кроме того, как пользователь или тестер, я действительно ненавижу щелкать и замораживать окна ...

Привет.

0 голосов
/ 24 августа 2011

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

Поток пользовательского интерфейса для индикатора выполнения или некоторой анимации, информационный текст, отмечающий, что происходит + фоновый рабочий поток = win

0 голосов
/ 24 августа 2011

Я бы поместил его в фоновый рабочий или огонь задачи, если вы находитесь в .NET 4.0, например:

void OnButtonClick(...)
{
    new TaskFactory().StartNew(() => { /* your excel and query code */ });
}
...