A volte l'utente avvia un'operazione tecnica estesa che richiede del tempo per essere eseguita. In questi casi, di solito è bello visualizzare una sorta di barra di avanzamento, insieme alle informazioni su quale attività è in esecuzione in questo momento.
Al fine di evitare un accoppiamento ravvicinato dell'interfaccia utente e dei livelli logici, in genere è preferibile che la comunicazione avvenga tramite un tipo di proxy. Cioè, il back-end non dovrebbe manipolare i propri elementi dell'interfaccia utente o interagire direttamente con il livello intermedio.
Ovviamente, ci deve essere qualche richiamo da qualche parte per farlo funzionare. In genere l'ho implementato in due modi:
Passa un oggetto mutabile al back-end e fai in modo che il back-end lo modifichi in corso. L'oggetto notifica al front-end quando si verifica una modifica.
Passare una funzione di richiamata del modulo
void f(ProgressObject)
oProgressObject -> unit
richiamata dal back-end. In questo caso, il back-end costruisceProgressObject
ed è completamente passivo. Deve costruire un nuovo oggetto ogni volta che vuole segnalare i progressi, suppongo.
Quali sono gli svantaggi e i vantaggi di questi metodi? Esiste un metodo migliore concordato da utilizzare? Ci sono diverse circostanze per il loro uso?
Esistono tecniche completamente diverse di segnalazione dei progressi che ho trascurato?
BackgroundWorker
che RH menziona. Avvolto in una classe personalizzata insieme a un "modulo di avanzamento", ecc. E un semplice meccanismo per comunicare un'eccezione, come BackgroundWorker
da progettazione viene eseguito in un thread separato. Nella misura in cui usiamo le sue caratteristiche in un modo suggerito da .Net, allora si potrebbe dire che è idiomatico. E in qualsiasi contesto linguistico / quadro "idiomatico" può essere il migliore.