2010-10-22 8 views
7

Questa è una domanda di pari livello a this programmers question.Esistono pericoli non ovvi nell'utilizzo di thread in ASP.NET?

In breve, stiamo cercando di spingere un po 'di lavoro che è stato supportato da porzioni di utenti in background "correttamente". La domanda collegata mi ha dato molte idee se dovessimo seguire il percorso del servizio, ma non abbiamo davvero fornito argomenti convincenti sul perché, esattamente, dovremmo.

Devo ammettere che, per me, la possibilità di fare l'equivalente morale di

WorkQueue.Push(delegate(object context) { ... }); 

è davvero convincente, quindi se è solo un po 'difficile (piuttosto che intrinsecamente impraticabile) Sono incline ad andare con l'approccio del thread in background.

Quindi, i problemi con thread in background io sappia (nel contesto di un AppPool):

  • Possono morire in qualsiasi momento, a causa della AppPool essere riciclato
    • Soluzione: monitorare quando viene eseguita un'operazione, in modo che possa essere eseguito ri-* dovrebbe essere necessario un nuovo filo
  • Il ThreadPool viene utilizzato per rispondere alle richieste HTTP in arrivo, in modo da utilizzare può fame IIS
    • Soluzione: creare il nostro pool di thread, limitando anche il numero di thread.

La mia domanda è, quello che mi sto perdendo, se non altro? Cos'altro può andare storto? Con thread in background in ASP.NET?

* L'attività in questione è già sicura da rieseguire, quindi questo non è un problema.
ǂ Supponiamo che non stiamo facendo nulla di veramente stupido, come lanciare eccezioni nei thread in background.

+0

non sono la maggior parte dei 'pericoli' threading non ovvio ?? –

+0

@ Mitch - Sto cercando quelli peculiari di ASP.NET. Quei pericoli dei pedoni possono essere ignorati per ora, :) –

risposta

2

Un pericolo che ho incontrato personalmente è il CallContext. Stavamo usando CallContext per impostare i dati di identità degli utenti, perché lo stesso codice era condiviso tra la nostra applicazione Web e i nostri servizi applicativi basati su .NET Remoting (progettato per utilizzare CallContext per l'archiviazione di dati specifici delle chiamate) - quindi non stavamo usando il HttpContext.

Abbiamo notato che, a volte, una nuova richiesta si ritroverebbe con un'identità non nullo in CallContext. In altre parole, ASP.NET non stava annullando i dati memorizzati nel CallContext tra richieste ... e quindi un utente non autenticato potrebbe entrare nell'applicazione se ha raccolto un thread che aveva ancora il CallContext contenente informazioni sull'identità utente convalidate.

1

Lasciate che vi parli di un pericolo non ovvio :)

ho usato le discussioni per raccogliere un po 'di aggiornamento feed RSS nel mio database di un sito web sono stato hosting con GoDaddy. I thread funzionavano bene (se fossero stati terminati, sarebbero stati riavviati automaticamente a causa di alcuni controlli che avevo costruito in alcune pagine web).

Si stava lavorando ottimamente e sono stato molto felice, fino a quando GoDaddy (mio host allora) ha iniziato uccidendo i fili, e poi bloccato completamente. Quindi la mia app è appena morta!

Se questo non fosse non ovvio, che cosa è?

0

Uno potrebbe essere sei eccessivamente complicare l'architettura senza ottenere alcun beneficio.

programma Si sarà più costoso di scrivere, più costosi da mantenere e hanno una maggiore probabilità di avere bug.

+0

Meh, sono disposto ad assumere che possiamo farlo bene, se si può ottenere subito in primo luogo. Non è che non abbia mai scritto un pool di thread prima d'ora, diamine, Sam ha persino un OSS su [mediabrowser] (http://code.google.com/p/videobrowser/) (sebbene non sia pronto per IIS, e licenza non compatibile). Inoltre, ci sono vantaggi: la semplicità (non dovendo fare il marshalling oltre i confini del processo) è una di queste. –

+1

Sì, sono sicuro che è possibile farlo funzionare, ma le funzionalità extra giustificano il lavoro e la complessità extra –

3

vorrei stare lontano da discussioni lancio da con-in AppDomain IIS per StackOverflow. Non ho prove concrete a sostegno di ciò che sto per dire, ma lavorando con IIS per 10 anni, so che funziona meglio quando è l'unico gioco in città.

C'è anche un'alternativa, so che questo sta per essere una sorta di take off on my answer sopra sul filo programmatori. Ma, a quanto ho capito, hai già una soluzione che funziona supportando il lavoro sulle richieste degli utenti. Perché non utilizzare quel codice, ma avvialo solo quando viene chiamata un'API interna speciale. Quindi utilizzare Task Scheduler per chiamare un comando CURL che chiama quell'API ogni 30 secondi circa per avviare le attività. In questo modo stai permettendo a IIS di gestire il threading e il tuo codice gestisce qualcosa che già fa facilmente.

Problemi correlati