2012-04-24 11 views
6

Questo è ASP.NET ASMX Web Service/.NET Framework 4.0.ThreadPool.QueueUserWorkItem in servizio Web per attività "Fire and Forget"

Nel servizio Web, voglio eseguire un metodo su un altro thread come "Fire and Forget" in modo che il servizio Web restituisca un valore in risposta immediatamente al sito web. Quel metodo su un altro thread potrebbe richiedere 10 minuti dopo che il servizio Web restituisce immediatamente la risposta al sito Web. Inoltre, non ho bisogno del valore di ritorno di quel metodo.

Ho verificato questo scenario utilizzando ThreadPool.QueueUserWorkItem e sembra che il thread iniziato a utilizzare ThreadPool continui a essere eseguito anche dopo che Web Service ha restituito la risposta al sito Web. Sono corretto qui? C'è anche un modo migliore per raggiungere questo obiettivo?

risposta

6

Il problema è che di tanto in tanto, ASP.NET ricicla il pool di app. Poiché non conosce l'attività in background, non verrà considerata e verrà interrotta quando l'AppDomain viene eliminato.

La maggior parte delle volte, il lavoro verrà completato, ma se si esegue abbastanza a lungo, si verificherà questo scenario.

ci sono due soluzioni:

1) Il modo "corretto" è quello di scrivere un servizio di Windows che corre fuori ASP.NET. È possibile inviare istruzioni al servizio su WCF.

2) Il modo "veloce e sporco" è scrivere un servizio Web nascosto nel proprio sito ASP.NET che non viene mai chiamato dagli utenti. L'app avvia una richiesta asincrona al servizio nascosto e restituisce all'utente il proprio risultato, senza attendere.

ASP.NET non sa che la richiesta del servizio nascosto proviene dall'interno della tua app - lo tratta come un'altra richiesta. Poiché ASP.NET conosce questa richiesta, non lo interromperà quando ricicla.

+0

Ciao Nicola, come il servizio Web nascosto all'interno di asp.net garantisce che il pool di applicazioni non venga riciclato? – Abhijeet

+0

Mi interessa il "quick and dirty" - dovrei semplicemente creare una nuova funzione asincrona chiamata dal metodo webservice che l'utente ha avviato? –

Problemi correlati