5 Stimmen

Wie unterdrücke ich einen thread.abort() Fehler C#?

Ich zeige einen Splash-Screen in einem Hintergrund-Thread an, während mein Programm geladen wird. Sobald das Programm geladen ist, breche ich den Thread ab, da es der einzige Zweck war, ein "Now Loading"-Splash-Formular anzuzeigen.

Mein Problem ist, dass beim Abbrechen eines Threads ein ThreadAbortException auf die der Benutzer einfach weiter klicken kann.

Wie kann ich damit umgehen? Ich habe versucht, es so zu unterdrücken -->

            try
        {
            Program.splashThread.Abort();
        }
        catch(Exception ex)
        {

        }

aber ich habe das Gefühl, dass man mich hier anschreien wird, und das funktioniert so oder so nicht.

Gracias.

4 Stimmen

Ich habe erst kürzlich einen Blog über die Erstellung eines Startbildschirms geschrieben. Mal sehen, ob Ihnen das weiterhilft: crazorsharp.blogspot.com/2009/06/ </self_promotion>

2 Stimmen

Wenn Sie Thread.Abort verwenden müssen, machen Sie (im Allgemeinen) etwas falsch. Versuchen Sie, einen anderen, sichereren Weg zu finden. Viele gute Vorschläge unten.

1 Stimmen

@BFree: Wenn ich könnte, würde ich Sie an der Antwort teilhaben lassen! Danke für das konstruktive Feedback. Ich lerne schon so viel von Ihrem Beitrag! Während die andere Antwort meine aktuelle Lösung zum Funktionieren gebracht hat, erwarte ich, dass ich ein robusteres Splash aus den Informationen in Ihrem Blog erstellen werde. Ich danke Ihnen!

1voto

Ana Betts Punkte 72423

Warum sollten Sie das tun? Setzen Sie einfach eine Flagge, die der Thread abfragt, und wenn der Thread sie schließlich aufgreift, schließt er sich selbst.

1voto

abdul haddi Punkte 11

Versuchen Sie diesen Code. Bei mir funktioniert er gut.

void splash()
{
    try {
        SplashScreen.SplashForm frm = new SplashScreen.SplashForm();
        frm.AppName = "HR";

        Application.Run(frm);
    }
    catch (ThreadAbortException ex)
    {
        Thread.ResetAbort();
    }
}

0voto

Ich habe die von Fredrik Mörk vorgeschlagene Lösung verwendet. Sie ist sehr klar und elegant. Ansonsten habe ich ein Problem gefunden, wenn wir das Splash-Formular vor dem Start der eigentlichen Anwendung instanziieren (application.run (mainform...)):

wird eine invalidOprationException ausgelöst, weil das Formular-Handle im aufrufenden Thread noch nicht existiert. Um das Handle direkt im Thread t zu erstellen (und diese Ausnahme zu umgehen!), versuchen Sie, das Splash-Formular auf diese Weise zu starten:

Thread t = new Thread(new ThreadStart(delegate
{
    _splash = new Splash();
     Application.Run(_splash);
}));

t.Start();

und wenn Sie planen, die closeSplash-Methode in mehreren Programmzweigen aufzurufen, erzwingen Sie den Nullwert nach dem ersten Aufruf:

    private static Splash _splash = null;
    public static void CloseSplash()
    {
        if (_splash!= null)
        {
            _splash.CloseSplash();
            _splash=null;
        }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X