A veces, el usuario inicia una operación técnica extendida que demora un tiempo en ejecutarse. En estos casos, generalmente es bueno mostrar algún tipo de barra de progreso, junto con información sobre qué tarea se está ejecutando en este momento.
Para evitar el acoplamiento cercano de la interfaz de usuario y las capas lógicas, generalmente es mejor que la comunicación se produzca a través de algún tipo de proxy. Es decir, el back-end no debe manipular sus propios elementos de la interfaz de usuario, o incluso interactuar directamente con la capa intermedia.
Obviamente, debe haber alguna devolución de llamada en algún lugar para que esto funcione. Generalmente lo he implementado de una de dos maneras:
Pase un objeto mutable al back-end y haga que el back-end le haga cambios en el progreso. El objeto notifica al front-end cuando ocurre un cambio.
Pase una función de devolución de llamada del formulario
void f(ProgressObject)
oProgressObject -> unit
que invoque el back-end. En este caso, el back-end construyeProgressObject
y es completamente pasivo. Supongo que debe construir un nuevo objeto cada vez que quiera informar sobre el progreso.
¿Cuáles son los inconvenientes y las ventajas de estos métodos? ¿Existe un mejor método acordado para usar? ¿Existen diferentes circunstancias para su uso?
¿Hay técnicas completamente diferentes de informar el progreso que he pasado por alto?
BackgroundWorker
menciones de RH. Envuelto en una clase personalizada junto con un "formulario de progreso", etc. y un mecanismo simple para comunicar una excepción, como BackgroundWorker
por diseño se ejecuta en un hilo separado. En la medida en que usemos sus características de una manera sugerida por .Net, entonces podría decirse que es idiomático. Y en cualquier contexto de lenguaje / marco dado, "idiomático" puede ser lo mejor.