Qual è il modo migliore per gestire il lungo processo in esecuzione in un ASP.Net applicazione?

StackOverflow https://stackoverflow.com/questions/73039

  •  09-06-2019
  •  | 
  •  

Domanda

Nella mia applicazione web c'è un processo che richiede l'inserimento di dati da tutto il web, filtri, e salva nel database.Come potete immaginare questo processo richiede un certo tempo.La mia soluzione attuale è quello di aumentare il timeout della pagina e dare un AJAX barra di avanzamento per l'utente mentre si carica.Questo è un problema per due motivi: 1) si prende ancora a lungo e che l'utente deve attendere 2) a volte ancora timeout.

Ho iniziato a infilare il processo di lettura dovrei async post per un servizio web ("Fire and forget").

Alcuni riferimenti che ho letto:
- MSDN
- Fuoco e Dimenticare

Quindi la mia domanda è: - quale è il metodo migliore?

AGGIORNAMENTO:Dopo l'utente inserisce i propri dati vorrei li reindirizza alla pagina di risultati che aggiorna in modo incrementale in quanto il processo è in esecuzione in background.

È stato utile?

Soluzione

Per evitare un eccessivo architettura, l'astronomia, mi capita spesso di utilizzare un iframe nascosto per chiamare il lungo processo in esecuzione e il flusso di informazioni sullo stato di avanzamento.Accoppiato con qualcosa di simile jsProgressBarHandler, si può abbastanza facilmente creare grande out-of-band progresso indicazione per più attività in cui un generico corso di animazione non è tagliato.

Nel caso specifico, se si desidera utilizzare uno LongRunningProcess.aspx chiamata per l'operazione, per evitare quegli pagina timeout.

Per esempio, si chiama LongRunningProcess.aspx?taskID=1 to kick off e poi alla fine dell'attività, emettono un

document.location = "LongRunningProcess.aspx?taskID=2".  

Fino alla nausea.

Altri suggerimenti

Abbiamo avuto un simile problema e risolto avviando il lavoro tramite un asychronous chiamata al servizio web (il che significa che l'utente non deve attendere per il lavoro di finitura).Quindi, il servizio web ha iniziato un Processo di SQL che ha eseguito i lavori e periodicamente aggiornata una tabella con lo stato del lavoro.Abbiamo fornito una UI che ha permesso all'utente di eseguire una query sulla tabella.

Mi sono imbattuto in questo problema esatto al mio ultimo lavoro.Il modo migliore che ho trovato era a fuoco spento un asychronous processo, e avvisare l'utente quando è fatto (e-mail o qualcos'altro).Farli attendere che lunga sta andando ad essere problematico, a causa di timeout e la perdita di produttività per loro.Avendo aspettare una barra di avanzamento può dare loro un falso senso di sicurezza che possono annullare il processo, quando si chiude il browser che può non essere il caso per caso a seconda di come hai impostato il sistema.

  1. Come stai interrogazione remota di dati?
  2. Quanto spesso si cambia?
  3. Sono i risultati di qualcosa che potrebbe essere memorizzate nella cache per un periodo di tempo?
  4. La durata di un periodo di tempo stiamo in realtà parlando?

Il "metodo migliore" è probabile che dipendono in qualche modo le risposte a queste domande...

È possibile creare un altro thread e memorizzare un riferimento al thread in sessione o lo stato dell'applicazione, a seconda se il thread può eseguire solo una volta al sito, oppure una sola volta per sessione utente.
È quindi possibile reindirizzare l'utente a una pagina in cui è in grado di monitorare il thread progresso.È possibile impostare la pagina per l'aggiornamento automatico, o la visualizzazione di un pulsante di aggiornamento per l'utente.
Al termine della discussione, si può inviare una e-mail all'utente.

La mia soluzione a questo, è stata una banda fuori servizio che fa questi e li memorizza nella cache in db.

Quando la persona che chiede per la prima volta qualcosa, avere un po ' di attesa, e poi si vede, ma se si aggiorna, il suo immediato, e poi perché il suo int egli db, i orarie di aggiornamento per le prossime 24 ore dall'ultima richiesta.

Aggiungi il posto di lavoro, con i relativi parametri, per un lavoro tabella di coda.Quindi, scrivere un servizio di windows che si tratta di posti di lavoro e la loro elaborazione, salvare i risultati di un percorso appropriato, e-mail del richiedente con un link ai risultati.È anche un bel tocco per dare una sorta di un'interfaccia utente in modo che l'utente può controllare lo stato del loro lavoro(s).

In questo modo è molto meglio che lanciare un thread separato o aumentare il tempo di timeout, soprattutto se l'applicazione è più grande e ha bisogno di scala, come si può semplicemente aggiungere di più server per l'elaborazione dei lavori, se necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top