0

J'ai une application Web asp.net 2.0 qui appelle un proc stocké en cours d'exécution (environ 3 minutes). Le sp effectue de nombreuses tâches sur le backend.Gestion des erreurs non gérées qui se produisent dans un processus threadé secondaire

Ma page utilise threading et ajax (panneau de mise à jour) et un contrôle de minuterie pour afficher une barre de progression à l'utilisateur. Tout cela fonctionne très bien à moins qu'il y ait une erreur dans le sp qui gèle simplement l'écran.

J'ai essayé d'utiliser une classe SafeThread que j'ai trouvée sur codeProject qui encapsule le processus thread et crée un événement qui peut être géré dans le cas d'une exception.

Dans le gestionnaire d'événements, je veux juste rediriger l'utilisateur vers une page d'erreur et afficher une erreur. Lors des tests, je peux casser le gestionnaire d'événements. Cependant, appeler Server.Transfer ou Response.Redirect n'a aucun effet.

Je ne sais pas pourquoi cela se produit. Je posterai mon code ci-dessous. Des idées ou des suggestions alternatives appréciées.

protected void btnSave_OnClick(object sender, EventArgs e) 
    { 
     DAC dac = new DAC(); 
     Session["RerunStatus"] = 0; 
     SafeThread thrd = new SafeThread(new ParameterizedThreadStart(dac.RerunTest)); 
     thrd.IsBackground = true; 

     //tell the SafeThread to report 
     //ThreadAbort exceptions 
     thrd.ShouldReportThreadAbort = true; 
     //attach a ThreadException handler for 
     //reporting SafeThread exceptions 
     thrd.ThreadException += new 
     ThreadThrewExceptionHandler(thrd_ThreadException); 

     thrd.Start(ddlRundate.SelectedItem.Text); 
     Session["RerunThread"] = thrd; 
     btnSave.Enabled = false; 
     Timer1.Enabled = true; 
    } 

    void thrd_ThreadException(SafeThread thrd, Exception ex) 
    { 
     //thrd.Abort(); 
     Timer1.Enabled = false; 
     //Response.Redirect("ErrorPage.aspx"); 
     Server.Transfer("ErrorPage.aspx?ErrorMsg=" + ex.Message); 
     //thrd.Abort(); 
    } 
+0

Afin de faciliter la compréhension (et la réponse), j'ai essayé de diviser votre texte en paragraphes. Merci de vérifier si je n'ai pas trop changé de sens. Si oui, veuillez revenir en arrière. –

+0

Aussi, je suppose que c'est asp.net? –

Répondre

1

Vous ne pouvez utiliser Server.Transfer()/Response.Redirect() lors de la manipulation d'une demande - ce n'est pas le cas lorsque votre thrd_ThreadException() get appelé. Essayez de définir un drapeau dans votre thrd_ThreadException et faites la redirection dans l'événement Timer1 Tick.

+0

Merci beaucoup - cela a fait l'affaire! – MikeD

Questions connexes