none
Wartefenster im seperaten Thread schließen RRS feed

  • Frage

  • Hallo!

    Ich möchte ein Warte-Fenster in einem seperatem Thread anzeigen und auch wieder schließen.

    Das Warte-Fenster "starte" ich so in einen seperatem Thread:

    New_Warten_Window();          // Warte-Fenster anzeigen
    
    
    #region Warte-Fenster
    private void New_Warten_Window()
    {
        System.Threading.Thread newWindowThread = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadStartingPoint));
        newWindowThread.SetApartmentState(System.Threading.ApartmentState.STA);
        newWindowThread.IsBackground = true;
        newWindowThread.Start();
    }
    
    private void ThreadStartingPoint()
    {
        Warten tempWindow = new Warten();
        tempWindow.Show();
        System.Windows.Threading.Dispatcher.Run();
    }
    
    private void Close_Warte_Window(Warten w)
    {
        if (w.Dispatcher.CheckAccess())  w.Close();
        else w.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new System.Threading.ThreadStart(w.Close));
    }
    
    #endregion

    Die Animation in diesem Warte-Fenster wird perfekt ausgeführt.

    Mein Problem ist das Schließen dieses Fensters (Close_Warte_Window), da ich keine Referenz auf das im seperatem Thread gestartete Warte-Fensters habe.



    • Bearbeitet perlfred Dienstag, 22. Mai 2018 16:39
    Dienstag, 22. Mai 2018 16:37

Antworten

Alle Antworten

  • Hallo,

    ich würde dies über eine CancellationTokenSource lösen.

    In deinem Fall könntest Du deinem weitern Fenster den Token übergeben und in einer Schleife prüfen ob ein Abbruchvorgang ausgeführt wurde. Sollte es so sein kann sich das Fenster selbst schließen.

    Gruß Thomas


    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: Icon für UWP, UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    Dienstag, 22. Mai 2018 17:51
  • Hallo Thomas!

    Danke für deine Überlegung!

    Da es ein Warte-Fenster ist, müsste ich den Abbruch-Vorgang auch programmtechnisch auslösen, damit das Fenster geschlossen werden kann. Ich habe das jetzt alles umgangen, indem ich im Applikationsobjekt eine statische Eigenschaft definiert habe, auf die ich aus jedem Thread heraus zugreifen kann:

    public partial class App : Application
    {
        public static Warten wndWarten;
    }
    

    Warte-Fenster Aufruf:

    private void ThreadStartingPoint()
    {
        if (App.wndWarten == null)
        {
            App.wndWarten = new Warten();
            App.wndWarten.Show();
            System.Windows.Threading.Dispatcher.Run();
        }
    }

    Warte-Fenster schließen:

    Close_Warte_Window(App.wndWarten);  // Warte-Fenster schließen
    

    Mittwoch, 23. Mai 2018 12:02
  • Hi Fred,
    das ist keine gute Idee / Lösung. Mit statischen Membern, die nicht eindeutig Klassen zugeordnet sind, sollte man sehr sparsam umgehen. Solche Member können später bei Erweiterung oder Anpassung eine Menge Probleme bereiten. Besser ist es, möglichst vollständig objektorientiert zu arbeiten. Dazu ist Thomas' Vorschlag ein guter Lösungsweg.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 23. Mai 2018 12:10