0

Ich habe eine asp.net 2.0-Webanwendung, die eine lange laufende gespeicherte Proc aufruft (ca. 3 Minuten). Der SP führt tatsächlich viele Aufgaben im Backend aus.Behandeln von nicht behandelten Fehlern, die in einem sekundären Thread-Prozess auftreten

Meine Seite verwendet Threading und Ajax (Update-Panel) und ein Timer-Steuerelement, um eine Fortschrittleiste für den Benutzer anzuzeigen. Das alles funktioniert großartig, es sei denn, es gibt einen Fehler in der SP, der den Bildschirm nur einfriert.

Ich habe versucht, eine SafeThread-Klasse zu verwenden, die ich auf codeProject gefunden habe, die den Thread-Prozess umschließt und ein Ereignis erstellt, das im Falle einer Ausnahme behandelt werden kann.

Im Event-Handler möchte ich nur den Benutzer auf eine Fehlerseite umleiten und einen Fehler anzeigen. Beim Testen kann ich den Event-Handler einbrechen. Der Aufruf von Server.Transfer oder Response.Redirect hat jedoch keinerlei Auswirkungen.

Ich bin mir nicht sicher, warum das passiert. Ich werde meinen Code unten posten. Irgendwelche Ideen oder alternative Vorschläge geschätzt.

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

Um es einfacher zu verstehen (und zu beantworten) habe ich versucht, Ihren Text in Absätzen ein bisschen zu brechen. Bitte überprüfen Sie, ob ich die Bedeutung nicht zu sehr geändert habe. Wenn ja, bitte zurückrollen. –

+0

Auch ich nehme an, das ist asp.net? –

Antwort

1

Sie können nur Server.Transfer()/Response.Redirect() verwenden, wenn sie eine Anforderung Handhabung - das ist nicht der Fall ist, wenn Ihr thrd_ThreadException() genannt bekommen.

Versuchen Sie, ein Flag in Ihrer thrd_ThreadException zu setzen, und führen Sie die Umleitung im Timer1 Tick-Ereignis durch.

+0

Vielen Dank - das hat den Trick gemacht! – MikeD