Sono abbastanza nuovo per asp.net e C# quindi portami con me. Inoltre, mi scuso se questo è stato chiesto prima ... in tal caso per favore mi indirizza a una pagina che è di aiuto.asp.net C# ajax in esecuzione lavoro batch "asincrono"
Quello che ho:
Una pagina: Con 4 UpdatePanels
prima UpdatePanel che contiene un (voce) GridView, opzioni di visualizzazione utente (non è importante a questa domanda) e il pulsante che esegue una ricerca nel database che restituisce un elenco di elementi visualizzati nella griglia. L'utente seleziona un elemento su questa griglia ...
2nd UpdatePanel contiene un elenco a discesa contenente un elenco di attività disponibili caricate da un XML. L'utente selezionerà un'attività, che visualizza un mucchio di opzioni/parametri disponibili (anche caricati dal file XML) a un altro (parametro) gridview nel secondo pannello di aggiornamento. Gridview qui avrà sempre una riga di dati. Sto usando gridview qui perché è più facile piuttosto che creare controlli dinamici (i parametri sono diversi per ogni attività). L'utente è in grado di inserire i valori dei parametri nella griglia. L'utente fa clic su un pulsante Aggiungi e l'attività viene aggiunta a un'altra vista griglia nel 3 ° pannello di aggiornamento.
3 ° UpdatePanel contiene un GridView (task) che contiene tutto il compito aggiunto dall'utente. C'è anche un pulsante che suppone di eseguire in batch tutte le attività. Quando si fa clic sul pulsante, passa attraverso la griglia (attività) alla ricerca di attività in sospeso da eseguire. Per ogni attività in sospeso, chiama un servizio Web che gestisce l'attività in modo appropriato. Il servizio Web restituisce il risultato dell'attività insieme all'output del registro.
4 ° UpdatedPanel per ora solo contiene un div che visualizza l'output del registro tornato da servizio web.
Quello che voglio lavorare più avanti e non so come è:
- Come si esegue un processo batch 'asincrono'? Quello che sto cercando di ottenere è che, quando l'utente fa clic sul pulsante di esecuzione batch, il 3 ° (update) updatepanel e tutto il suo controllo vengono disabilitati mentre i processi batch vengono eseguiti "dietro la scena". A seconda dell'attività, ciascuna attività può richiedere fino a 5 secondi ciascuna. Se l'utente avesse creato 60 attività, penserei che questo causerebbe anche il timeout della pagina?
- Mentre il processo batch è in esecuzione, l'utente può inoltre cercare altri elementi (voce) UpdatePanel e aggiungere nuove attività utilizzando (parametro) UpdatePanel a (task) UpdatePanel.
- (Attività) UpdatePanel mostrerà una sovrapposizione "Lavoro in corso ..." quando il lavoro è in esecuzione.
Spero che tu capisca la mia domanda. Molto apprezzato se qualcuno potesse essere così gentile da dare alcune indicazioni e/o le indicazioni su come affrontare questo compito
Ulteriori informazioni:
Utilizzando Framework 3.5
utilizzando ASP.net C# + Ajax
Web Il servizio è di gSOAP su una scatola di Solaris
Molte grazie in anticipo.
dispiace per essere un noob, stavo cercando di rispondere al tuo aiuto, ma ha scoperto che c'è un limitato di caratteri posso mettere in. Mi limiterò a aggiornare i miei commenti per ora.
Grazie per il suggerimento. Scusate per la risposta tardiva, mi sono guardato intorno l'altro giorno e ho apportato alcune modifiche, facendolo funzionare con "PageAsyncTask" e "IAsyncResult". Ho creato una classe di servizio web che verrà chiamata dalla pagina. La nuova classe di servizi Web sarà chiamata il servizio web gSoap. Sono riuscito a eseguire una sorta di "asincrona".
Ho un pulsante che esegue:
protected void StartASyncJob()
{
PageAsyncTask task = new PageAsyncTask(
new BeginEventHandler(BeginAsyncCommandTask),
new EndEventHandler(EndAsyncCommandTask),
new EndEventHandler(AsyncCommandTaskTimeOut), null);
RegisterAsyncTask(task);
}
BeginAsyncCommandTask passerà attraverso la griglia, ottiene il primo compito in sospeso e chiama il servizio web.
EndAsyncCommandTask recupererà quindi i risultati restituiti, scrivendo il (registro) UpdatePanel. Avvierà quindi StartASyncJob() di nuovo alla ricerca del successivo record in sospeso da elaborare.
Tutto questo funziona SOLO se non si fa nient'altro sulla pagina. Se ero (mentre il processo asincrono era in esecuzione) per eseguire una ricerca di più elementi in (item) gridview o selezionare una nuova attività dal droplist della (attività), l'evento non si attiva fino al completamento del processo di servizio web asincrono. E quando viene completato, l'elenco a discesa o l'evento di ricerca si attiva, i miei dettagli di registro restituiti dal servizio Web non vengono aggiornati.
Immagino che l '"attesa" sia causata dal fatto che "PageAsyncTask" è "spawn" dallo stesso thread di pagina?
Avrei pensato che il servizio web "asincrono" consentisse all'utente di fare più di una cosa alla volta dando una migliore esperienza utente. Ma sembra che io abbia torto e/o non abbia fatto bene.
Non ho ancora provato il tuo suggerimento di usare QueueUserWorkItem; ma prima di farlo, posso chiedere se darà lo stesso effetto di usare 'PageAsyncTask'. L'uso di QueueUserWorkItem avrà lo stesso effetto di 'spawning from same page thread'?
Molte grazie in anticipo. Scusate se non mi sono spiegato bene e per favore fatemi sapere se avete bisogno di me per pubblicare il mio codice.
Grazie per la risposta. Ho inserito alcuni commenti aggiuntivi sul mio post originale riguardanti i miei progressi – user1905597