При использовании индикатора выполнения в Windows Forms «длительный процесс» должен запускаться в потоке без интерфейса пользователя? - PullRequest
1 голос
/ 19 мая 2011

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

У меня есть несколько окон, которые открываются и полностью отображаются, и я хотел бы, чтобы что-то указывало пользователю, что что-то происходит. Некоторые из них нетерпеливы, и если пользовательский интерфейс перестает отвечать на запросы в течение 1/4 секунды, они начинают щелкать как сумасшедшие.

т.е. длительный процесс не обязательно что-то, что я хочу запустить в фоновом потоке. Так как бы вы отобразили индикатор выполнения в этом случае?

Ответы [ 3 ]

2 голосов
/ 19 мая 2011

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

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

2 голосов
/ 19 мая 2011

Вы можете использовать Application.DoEvents() в потоке графического интерфейса, чтобы разрешить обновление индикатора выполнения, однако это не рекомендуется из-за проблем с повторным входом и производительностью.
Ваша лучшая ставка - это фоновый поток.
Этосделано особенно легко в .NET Framework с классом System.Threading.BackgroundWorker. Msdn справка по фоновым работникам

0 голосов
/ 19 мая 2011

Вы можете запустить длинную задачу в потоке пользовательского интерфейса и одновременно показать индикатор выполнения.

Однако вы потеряете анимацию Win7 / Vista на индикаторе выполнения, и если вы не запустите цикл сообщений в течение пяти секунд, Windows пометит ваше приложение как «не отвечающее».

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

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

Так что я рекомендую BackgroundWorker для более длинных задач. Для коротких задач может показаться заставка, как предложил Гейб в своем комментарии.

...