2012-06-01 4 views
2

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

В принципе, то, что у меня есть следующий сценарий:

У меня есть пользовательский интерфейс (WinForm), что позволяет пользователям выбрать несколько файлов для загрузки, а затем нажмите кнопку «Загрузить», чтобы приступить загрузки. Все загрузки обрабатываются асинхронно, чтобы избежать блокировки формы. Однако, хотя я не хочу, чтобы форма блокировалась сообщением «Не реагировать», я также не хочу, чтобы пользователь мог изменять поля формы во время загрузки.

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

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

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

Приветствия, J

ответ

1

Альтернатива 1

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

Чтобы установить задачу для фона BackgroundWorker, вам необходимо прикрепить обработчик к событию DoWork, а затем вызвать RunWorkerAsync().

Альтернатива 2

Другой альтернативой является использование IObservable<T> создать механизм для реагирования на ход загрузки, то вы могли бы сделать привязку с помощью Reactive.

Я принимаю вас, являются новыми для реактивных. В этом случае лучше всего это введение доступно (на мой взгляд):

http://channel9.msdn.com/Blogs/codefest/DC2010T0100-Keynote-Rx-curing-your-asynchronous-programming-blues


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

+0

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

+0

Просто прочитал интерфейсы IObserver/IObservable, они выглядят так, как будто они хорошо работают с тем, что я имею в виду. Благодаря! –

+0

@JasonLarke не торопитесь, и проверьте видео, которое я связал. Оно того стоит. – Theraot

Смежные вопросы