В 1.1 не так много поддержки для этого, но я расскажу вам, что я буду делать (извините, сейчас нет кода).
Что касается асинхронной операции, я 'd используйте APM , чтобы запустить и завершить асинхронный метод.Это полностью поддерживается в 1.1, так что не беспокойтесь.
Идея состоит в том, что в пользовательском интерфейсе вы сохраняете некоторое указание о том, что работа выполняется (например, поле логическое ) и (необязательно) Timer
, используемое для "пробуждения".«Пользовательский интерфейс на регулярной основе проверяет текущее состояние фоновой работы и сообщает об этом пользователю.
Вы должны установить логический , чтобы указать, что вы работаете в фоновом режиме,вызовите BeginInvoke()
вашего делегата (используя перегрузку, при которой принимает обратный вызов , выполняет поиск «Выполнение метода обратного вызова при завершении асинхронного вызова» ) и запускает Timer
.Когда пользователь пытается использовать пользовательский интерфейс, вы можете дополнительно проверить boolean и отменить операцию, тем самым не давая пользователю сделать что-то вредное во время ожидания.Когда таймер Tick
s, вы можете проверить состояние вашего асинхронного метода, скажем, через общее поле, в которое метод записывает обновления и читает пользовательский интерфейс.Например, double
, который пользовательский интерфейс использует для обновления индикатора выполнения.
После срабатывания обратного вызова вы убираете асинхронный беспорядок (т. Е. Вызываете EndInvoke
, обрабатываете любые исключения и т.д.)отключите Timer
и сбросьте поле boolean running индикации.
Используя этот метод, вы можете сохранить пользовательский интерфейс полностью отзывчивым (и частично используемым, в зависимости от вашего общего дизайна), может настроить механизм прерывания фонового работника (с помощью другого поля, обратного логическому , упомянутому ранее, и информировать пользователя о состоянии операции.