2009-09-21 16 views
9

Ho una domanda generale su System.Threading.Threadpool quando viene eseguita in un'applicazione Web su IIS. Supponiamo di eseguire 2 richieste contemporaneamente e di attivare un paio di thread tramite il metodo ThreadPool.QueueUserWorkItem. Le due richieste condividono il ThreadPool o le chiamate al ThreadPool dalle due richieste operano in due pool separati?Threadpool in contesto IIS

Questo è in IIS6 e 7.

Grazie per qualsiasi comprensione.

risposta

14

Ecco una citazione dalla documentazione di MSDN sulla ThreadPool class:

C'è un pool di thread per processo. Il pool di thread ha una dimensione predefinita di 250 thread di lavoro per processore disponibile e 1000 thread di completamento I/O .

In IIS6 e IIS7 qualsiasi applicazione ASP.NET è ospitato all'interno di un unico processo (w3wp.exe ) attraverso l'infrastruttura pool di applicazioni.
Un pool di applicazioni può ospitare più applicazioni Web mantenendole in diversi domini dell'app, ma viene eseguito all'interno di un processo fisico sul server.

Questi due fatti significano in pratica che tutti i thread di un'istanza dell'applicazione Web in esecuzione vengono eseguiti all'interno dello stesso pool di thread .NET.

+2

Quindi, in pratica, ciò significa che l'utilizzo di ThreadPool per le applicazioni Web che devono attivare attività in più thread è una cattiva idea. –

+0

Poiché tutte le richieste Web sono già gestite in modo asincrono, direi che nella maggior parte dei casi non si ottiene alcun beneficio significativo dall'esecuzione delle operazioni nei thread in background nelle applicazioni Web. Probabilmente sarebbe un'eccezione se non si desidera bloccare l'elaborazione di una richiesta di attesa su un'operazione di lunga durata. In questo caso, è possibile attivare un thread in background, eseguire ulteriori operazioni sulla richiesta e infine attendere che si completi prima di inviare la risposta al client. –

+1

Nel mio caso, ho un servizio che viene eseguito in un contesto IIS e che esegue il numero X di richieste in uscita verso motori di ricerca diversi. Questi dovrebbero essere fatti in più thread poiché voglio massimizzare la velocità qui. Quando tutti i thread sono completi, raccolgo i risultati in una lista dei risultati e li restituisco al chiamante. Il motivo per l'utilizzo di un pool in questo caso è solo quello di utilizzare meno memoria, poiché riutilizza i thread nel pool. Ma se utilizzo lo stesso pool utilizzato da IIS, potrebbe non essere una buona classe da usare. –