Come aggiornare la visualizzazione durante un processo di elaborazione di grandi dimensioni

2

Ho un'applicazione ASP.NET C # che deve andare fuori e scorrere attraverso una directory di file .xml e fare un po 'di elaborazione sui dati al loro interno. Questo è abbastanza facile, ma ho bisogno di visualizzare il risultato dopo che ogni .xml è stato elaborato, come può essere fatto?

Ciò che veramente sto chiedendo è come elaborare un sacco di dati in un ciclo che deve essere visualizzato nuovamente al client anche se l'elaborazione del server non è stata completata completamente. È persino possibile?

Potrei avviare il grande processo in un thread separato e avviare un js timeout per postback e essenzialmente eseguire il polling del processo ma questo non suona bene e probabilmente richiederebbe l'uso di variabili statiche per mantenere lo stato.

Sarebbe corretto usare SessionState / ViewState / QueryString per mantenere lo stato di quale file è stato elaborato e eliminare del tutto il ciclo? Quindi separare il lavoro di grandi dimensioni in richieste separate?

    
posta cwc1983 01.12.2011 - 22:58
fonte

3 risposte

3

La linea di fondo qui è che se sei un server, non puoi mantenere una connessione persistente con i tuoi clienti. Ciò significa che la tua soluzione ha ottenuto per essere basata su una sorta di polling. Lo strutturerei in questo modo:

  1. Il client fa clic su "Inizia elaborazione" o simile.
  2. Di conseguenza, esiste una chiamata JavaScript AJAX a un WebMethod sul server.
  3. WebMethod avvia l'elaborazione e quindi restituisce il risultato dell'elaborazione del primo file quando è pronto.
  4. Il client riceve la risposta alla chiamata di servizio contenente il risultato dell'elaborazione del primo file, visualizza questa risposta e quindi richiede il risultato successivo.
  5. Server restituisce il risultato successivo dell'elaborazione e il ciclo continua.

L'avvertenza a questo, naturalmente, dipende da come la latenza della connessione client / server è comparabile al tempo medio impiegato per elaborare ogni file. Inoltre, devi mostrare all'utente il risultato di ogni elaborazione, oppure va bene se uno viene saltato perché il ciclo di elaborazione sta iterando più velocemente del ciclo di aggiornamento del display. Puoi sempre legarli insieme, in modo che il server non elabori il file successivo finché non riceve una richiesta di farlo dal client.

    
risposta data 01.12.2011 - 23:10
fonte
1

Contrariamente alla risposta di @ Mike, puoi effettivamente mantenere un "ordinamento" di connessione persistente con i tuoi clienti. Con HTML5 e WebSockets (o Flash), puoi. Tuttavia, c'è un modo molto semplice per farlo se non ti dispiace un servizio di terze parti.

Abbiamo appena implementato un sistema di chat in tempo reale in un sito di appartenenza utilizzando il servizio di Pusher.com. Forniscono una libreria JavaScript che mantiene una connessione persistente al loro server e quindi ti permettono di pubblicare messaggi sul loro server, che vengono immediatamente consegnati a tutti i client JavaScript, consentendo l'aggiornamento del display.

Dai un'occhiata: link

    
risposta data 02.12.2011 - 00:38
fonte
-1

Direi che dovresti non eseguire una lunga elaborazione, in modo che l'utente attenda da molto tempo in un'applicazione ASP.NET per iniziare.

Suggerisco di eseguire l'elaborazione in batch e di archiviare il risultato su un tipo di archivio dati (file o database).

Se le informazioni cambiano di frequente (ad esempio, continui a ricevere file XML), puoi impostare un trigger / watcher nelle directory per monitorare i file XML in arrivo, elaborare quelli nuovi e aggiornare i risultati (in batch). Potresti anche creare un lavoro ETL per questo.

    
risposta data 02.12.2011 - 01:45
fonte

Leggi altre domande sui tag