Utilizzo di una finestra di dialogo di avanzamento e multi-threading

0

La mia applicazione desktop Windows .NET crea un report HTML e ha 3 fasi principali. Può creare più report.

Visualizza una barra di avanzamento in modo che l'utente sappia (stima) quanto tempo ci vorrà (oltre a rassicurare che il sistema non si sia bloccato da una GUI di aggiornamento). Quindi, se dovessi generare 3 rapporti, ci sarebbero un totale di 9 fasi (3 fasi * 3 rapporti).

Il problema che ho ora è che il processo sta impiegando troppo tempo. Come tale, ho bisogno di usare i thread in modo da poter iniziare sulla fase 1, quindi aprire una nuova discussione che completa la fase 2 e 3. Mentre le fasi 2 e 3 sono in corso, la voce successiva nell'elenco inizia con la fase 1 e il processo continua. Spero che abbia senso.

Quindi ora sto pensando a cosa fare con la barra di avanzamento poiché verranno eseguite più fasi contemporaneamente. Al momento, l'unica cosa logica che riesco a pensare è

Report 1. Start phase 1. New thread -> Phase 2 and 3

Check to see if Report 2 is last report. It isn't, so, during Report 2 phase 2, start Report 2 phase 1. New thread -> Phase 2 and 3

Check to see if Report 3 is last report. It is. So, during report 2 phase 2, start Report 3 phase 1, then continue on the same thread with phase 2 and 3

Quanto sopra significherà che aggiorno la finestra di dialogo di avanzamento durante le fasi 2 e 3 dell'ultimo rapporto (e suppongo di dover aggiungere alcuni controlli per garantire che le altre fasi siano effettivamente finite).

Non riesco a immaginare di fare qualcosa di nuovo o diverso da ciò che è stato prima e, in quanto tale, mi chiedevo se esiste già un modello per affrontare il tipo di situazione?

    
posta Dave 31.03.2014 - 10:16
fonte

1 risposta

1

Cercherò di organizzarlo in attività, vale a dire un lavoro uno a uno con le tue fasi. In altre parole se hai 3 rapporti con 3 fasi ciascuno, avrai 3 * 3 o 9 compiti.

Sembrerebbe che alcune di queste attività possano essere eseguite in parallelo mentre altre no, quindi consentirei a un oggetto task di racchiudere un'altra attività, con il significato previsto che una volta che l'attività esterna è terminata, chiamerà semplicemente l'attività interna nello stesso thread.

Una volta fatto questo, dovrebbero esserci solo 6 di questi compiti (3 dei quali eseguono la fase 2 e il wrap task per la fase 3). A questo punto è possibile eseguire in sicurezza tutte e 6 le attività utilizzando un pool di thread di qualche tipo con un conteggio thread minimo e massimo.

A questo punto, per aggiornare la barra di avanzamento, aggiungerei un metodo ricorsivo all'oggetto task che chiede quanti compiti devono essere eseguiti, e sarebbe 1 + chiamata ricorsiva all'attività interna. Dato un elenco di attività, dovresti essere in grado di utilizzare questo metodo per determinare la quantità di passaggi di avanzamento.

Da lì, quando avvii ciascuna attività, dovresti passare facoltativamente un controllo della barra di avanzamento che lo aggiorna una volta che l'attività è terminata e poi passa la stessa istanza alle attività interne se ce ne sono.

Poiché utilizza il threading, la barra di avanzamento potrebbe aggiornarsi un po 'sporadicamente, ma tale è la natura dei thread. Spero che ti indichi la direzione giusta.

    
risposta data 31.03.2014 - 13:13
fonte

Leggi altre domande sui tag