2010-08-25 9 views
6

Espongo un thread di lavoro in un'applicazione ASP.NET in esecuzione su Windows Server 2008, IIS 7.5 La prima cosa che fa questo thread di lavoro è la sospensione per N secondi, e quindi fa il suo vero lavoro. Durante il sonno, prendi una ThreadAbortException.Perché un thread di lavoro nella mia spawn ASP.NET presenta una ThreadAbortException durante una sospensione?

Potete spiegare questo comportamento, e punti bonus di voi mi indicano tutte le impostazioni IIS/ASP.NET che possono essere utilizzate per regolare il comportamento.

MODIFICA: Ulteriori informazioni. Il suggerimento di prendere la ThreadAbortException mi ha aiutato a risolvere il problema, quindi grazie. Ho completamente riscritto la formulazione di questa domanda in base a ciò che ho imparato, ma ancora, la stessa domanda, perché questo thread di lavoro viene interrotto durante un sonno?

+0

Cosa succede se dormi per due periodi consecutivi di 17 secondi o meno? –

+2

perché non provare a catturare l'intero gestore thread e vedere cosa succede? Molto probabilmente ottieni ThreadAbortException che potrebbe avere qualcosa di utile in esso. –

+0

@Robert - nessun problema @ liho1eye - eseguirà –

risposta

6

A ThreadAbortException si verifica sul thread di lavoro perché su di esso è presente un'altra persona denominata Thread.Abort, quindi probabilmente non c'è nulla che riguardi direttamente il thread di lavoro, ma piuttosto una causa esterna. Il primo posto che dovresti controllare è il tuo codice personale per qualsiasi gestione dei thread o abortire che potresti fare. In caso contrario, per IIS, ciò potrebbe essere dovuto a un processo di lavoro (w3wp.exe) o un pool di app o all'appDomain che viene riciclato.

Il riciclo potrebbe essere dovuto all'impostazione del timeout di inattività per il pool di app, a un riciclo programmato regolarmente oa un trigger di utilizzo memoria/CPU. Questi sono configurabili tramite IIS Configuration Manager in Server Explorer (su Win 2K8) o semplicemente eseguendo inetmgr.exe. Secondo Tess' blog here, ci sono una serie di altre ragioni per il riciclaggio dominio di applicazione:

  • Machine.Config, web.config o Global.asax vengono modificati
  • La directory bin o il suo contenuto viene modificato
  • il numero di ri-compilazioni (aspx, ascx o ASax) supera il limite specificato dall'impostazione in machine.config o web.config (per default è impostato 15)
  • il ph percorso ico della directory virtuale viene modificato
  • La politica CAS viene modificato
  • Il servizio web viene riavviato
  • (2.0) Applicazione sub-directory vengono eliminati

Questo post sul blog ha anche informazioni su come rintracciare il motivo del riciclo. Per cominciare, prova a cercare nel registro eventi (eventvwr.msc) per vedere se ci sono informazioni dettagliate.

Si può anche provare a eseguire il debug del processo di lavoro direttamente. Collega il debugger VS all'istanza w3wp.exe dove viene eseguito il codice, aggiungi un punto di interruzione su Thread.Abort (potrebbe essere necessario abilitare ".NET Framework source stepping" nelle opzioni del debugger) e vedere da dove proviene il Abort utilizzando il chiamata stack window. Questo non ti dirà perché sta accadendo, ma almeno saprai chi lo sta facendo.

+0

Non riesco a eseguire il debug del thread direttamente perché il problema si verifica sul computer del provider di hosting, ma non sulle macchine che controllo.La mia logica non abortisce il thread. Il timeout di inattività predefinito è in minuti, mentre questo problema si verifica quando il mio thread ha una durata di 20 secondi. Non si applica nessuno degli altri motivi per il riciclaggio. Nessuna risposta.Rediretto né Response.End è coinvolto. Quindi ... ancora un mistero. –

+0

Ho appena risolto il mio problema: i miei thread sono stati interrotti nel mezzo e ciò è accaduto perché stavo scrivendo i miei registri nella cartella "bin" (che causava il reset di IIS) ... – Illidan

Problemi correlati