Às vezes, o usuário inicia uma operação técnica estendida que demora um pouco para ser executada. Nesses casos, geralmente é bom exibir algum tipo de barra de progresso, juntamente com informações sobre qual tarefa está sendo executada no momento.
Para evitar o acoplamento próximo entre a interface do usuário e as camadas lógicas, geralmente é melhor que a comunicação ocorra por meio de algum tipo de proxy. Ou seja, o back-end não deve manipular seus próprios elementos de interface do usuário nem interagir diretamente com a camada intermediária.
Obviamente, deve haver algum retorno de chamada em algum lugar para que isso funcione. Geralmente, eu o implementei de duas maneiras:
Passe um objeto mutável para o back-end e faça com que o back-end faça alterações no andamento. O objeto notifica o front-end quando ocorre uma alteração.
Passe uma função de retorno de chamada no formulário
void f(ProgressObject)
ouProgressObject -> unit
que o back-end chama. Nesse caso, o back-end constrói oProgressObject
e é completamente passivo. Ele deve construir um novo objeto toda vez que desejar relatar progresso, presumo.
Quais são as desvantagens e vantagens desses métodos? Existe um melhor método acordado para usar? Existem circunstâncias diferentes para o seu uso?
Existem técnicas completamente diferentes de relatar o progresso que eu negligenciei?
BackgroundWorker
esse RH menciona. Embrulhado em uma classe personalizada, juntamente com um "formulário de progresso" etc., e um mecanismo simples para comunicar uma exceção - conforme o BackgroundWorker
design é executado em um encadeamento separado. Na medida em que usamos seus recursos da maneira sugerida pelo .Net, isso pode ser considerado idiomático. E em qualquer contexto de linguagem / estrutura, "idiomático" pode ser o melhor.