2012-12-15 13 views
5

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

    1. 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 ...

    2. 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. 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. 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.

risposta

2

ci sono alcune soluzioni, ma dipende da quanto controllo si ha sul server.

  1. Se si ha il controllo pieno accesso al server, è possibile creare un'applicazione separata che si prenderà cura dei compiti; l'applicazione può essere un servizio di Windows e la comunicazione tra la tua pagina e l'applicazione potrebbe essere un database o MSMMQ (la comunicazione significa principalmente l'elenco delle attività e dei relativi stati: 1. esecuzione, 2. esecuzione 3. terminato).

  2. Un'altra soluzione è nel caso in cui non si disponga di un controllo di accesso completo sul server, ma sarà necessario implementare alcune comunicazioni tra i thread. Invece di avere l'applicazione che ho descritto al punto 1.si può avere un thread separato, che può essere avviato in questo modo:

    System.Threading.ThreadPool.QueueUserWorkItem(foo => LauchTaskRunner()); 
    

    Supponiamo implementato un metodo chiamato LaunchTaskRunner, che in un ciclo appena elabora l'elenco delle attività esistenti, la riga sopra inizierà in un processo separato . Puoi comunicare con questo metodo (che è in esecuzione in un thread separato) attraverso qualche variabile statica (dichiarata nella pagina), ad esempio:

    public class YourPage : System.Web.UI.Page{ 
        static IList<Task> tasks; 
        static void LauchTaskRunner(){ 
        // here make use of tasks variable 
        } 
    } 
    

    Ogni volta che il (compiti) UpdatePanel viene aggiornato, dovrebbe render basato sulla attività variabile.

+0

Grazie per la risposta. Ho inserito alcuni commenti aggiuntivi sul mio post originale riguardanti i miei progressi – user1905597

Problemi correlati