2009-06-18 10 views
18

Nel codice seguente, a volte someFunctionCall() genera un'eccezione "Il thread è stato interrotto". Come mai il codice nel blocco di codice B non viene mai eseguito? ASP.NET avvia una nuova discussione per ogni chiamata di metodo? Sono stato sorpreso di vedere che quando si verifica questa eccezione il codice nel blocco b non viene mai eseguito, il metodo restituisce e la mia applicazione continua a funzionare. Qualcuno può spiegare questo per favore?L'eccezione ASP.NET "Il thread è stato interrotto" causa l'uscita dal metodo

Grazie.

public void method() 
{ 
    // CODE BLOCK A 
    //... 


    try 
    { 
     someFunctionCall(); // this call is generating thread abort exception 
    } 
    catch(Exception ex) 
    { 
     // log exception message 
    } 

    // CODE BLOCK B 
    // ... 

} 

risposta

29

Questo è un ThreadAbortException; è un'eccezione speciale che viene automaticamente rimandata alla fine di ogni blocco catch, a meno che non si chiami Thread.ResetAbort().

metodi ASP .Net come Response.End o (a meno che non si passi false) lanciare questa eccezione per terminare l'elaborazione della pagina corrente; il tuo someFunctionCall() probabilmente sta chiamando uno di questi metodi.

ASP .Net gestisce questa eccezione e chiama ResetAbort per continuare l'elaborazione.

+1

Quindi, come posso far sì che ignori tale eccezione e continui a eseguire il codice nel blocco B? –

+0

Sei sicuro di volerlo? Se someFunctionCall sta reindirizzando o terminando la risposta, probabilmente non si dovrebbe continuare. – SLaks

+0

Cosa fa un po 'di FunctionCall? – SLaks

-2

provare in questo modo:

Questo è il mio metodo di estensione:

public static void WriteJSONObject(this HttpResponse response, object content) { 
      response.ContentType = "application/json"; 
      response.Write(new JavaScriptSerializer().Serialize(content)); 
      response.End(); 

} 

E la logica:

public void RegisterUser() { 
    try { 
     Response.WriteJSONObject(new { Result = "See hello" }); 
    } 
    catch (Exception err) { 
     if (err.Message != "Thread was being aborted.") 
      Response.WriteJSONObject(new { Result = err.Message }); 
     else { 
      Response.End(); 
     } 
    } 
} 
+11

Questo è sbagliato. Non dovresti confrontare il 'messaggio' di un'eccezione con una stringa hard-coded. Invece, puoi scrivere catch (ThreadAbortException) {} catch (Exception ex) {...} '.Inoltre, non ha senso chiamare "Response.End" se esiste già una "ThreadAbortException". – SLaks

+0

Sta funzionando bene anche se sembra sbagliato. – Tarik

+0

P.s: Le soluzioni di cui sopra non hanno funzionato per me come la maggior parte delle persone. Non importa quello che ho fatto non ha funzionato quindi questa è l'unica soluzione che ho trovato e funziona bene. – Tarik

1

Per aggirare il problema, utilizzare uno dei i seguenti metodi: Per Response.End, chiamare loMetodoanziché Response.End per ignorare l'esecuzione del codice sull'evento Application_EndRequest.

Per Response.Redirect, utilizzare un sovraccarico, Response.Redirect(String url, bool endResponse) che passa false per il parametro endResponse per sopprimere la chiamata interna a Response.End. Per esempio:

Response.Redirect ("nextpage.aspx", false); 

Se si utilizza questa soluzione, il codice che segue Response.Redirect viene eseguito. Per Server.Transfer, utilizzare invece il metodo Server.Execute.

Problemi correlati