none
Lost in Threads - Statusmeldung vom Background zum datengebundenen UI schicken RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte während einer längeren Läufzeit einer Methode (ca. 10 Sekunden) zwischendurch immer mal wieder Statusmeldungen an das UI senden.

    Das Statusfeld ist hierbei ein Textblock mit Datenbindung:

    <TextBlock Name="tbStatus" Text="{Binding StatusValue, UpdateSourceTrigger=PropertyChanged}"></TextBlock>

    Die Datenbindung funktionert.

    Da das UI reaktiv bleiben soll, rufe ich meine Langläufer-Methode im Hintergrund auf:

    private void txtSeekPattern_PreviewKeyDown(object sender, KeyEventArgs e)
            {
                string searchstring = txtSeekPattern.Text;
    
                ThreadStart start = delegate()
                {
                    Dispatcher.Invoke(DispatcherPriority.Background,
                                      new Action<string>(BuildDeviceList),
                                      searchstring);
                };
                new Thread(start).Start();
    
            }

    Aus diesem Backgroundtread heraus würde ich gerne auf gleiche Weise den Statustext ändern (svm ist mein ViewModel und SetStatusString ist darin die Methode zum aktualisieren des Status):

            private void BuildDeviceList(string searchstring)
            {
                Dispatcher.Invoke(DispatcherPriority.Normal,
                                      new Action<string>(svm.SetStatusString),
                                      "erste Meldung");
    
    
                //jede Menge Berechnungen ab hier hier...
                //...
    
                Dispatcher.Invoke(DispatcherPriority.Normal,
                                      new Action<string>(svm.SetStatusString),
                                      "zweite Meldung");
    
                //und noch mehr ...
            }

    Zu meiner Überraschung wird das UI aber erst aktualisiert, nachdem BuildDeviceList komplett abgearbeitet wurde. Auch eine Änderung DispatcherPriority.Send für die Statusmeldungen ändert daran nichts.

    1. Was mache ich hierbei falsch?

    Danke für Eure Hilfe!

    Sandra

    Donnerstag, 21. Juni 2012 09:52

Antworten

  • Grüße.

    Dein Problem liegt darin, das du das ganze nicht wie erwartet in nem extra Thread ausführst, sondern im UI-Thread ;)

    Ursache des ganzen ist folgender Code

    ThreadStart start = delegate()
                {
                    Dispatcher.Invoke(DispatcherPriority.Background,
                                      new Action<string>(BuildDeviceList),
                                      searchstring);
                };

    ersetz den Teil im delegate durch

    BuildDeviceList(searchstring);

    und du solltest das ganze wie gewünscht zum laufen bekommen.


    • Bearbeitet David.Handke Freitag, 22. Juni 2012 14:05 typo
    • Als Antwort markiert SSeilmann Montag, 25. Juni 2012 13:24
    Freitag, 22. Juni 2012 14:05

Alle Antworten

  • Grüße.

    Dein Problem liegt darin, das du das ganze nicht wie erwartet in nem extra Thread ausführst, sondern im UI-Thread ;)

    Ursache des ganzen ist folgender Code

    ThreadStart start = delegate()
                {
                    Dispatcher.Invoke(DispatcherPriority.Background,
                                      new Action<string>(BuildDeviceList),
                                      searchstring);
                };

    ersetz den Teil im delegate durch

    BuildDeviceList(searchstring);

    und du solltest das ganze wie gewünscht zum laufen bekommen.


    • Bearbeitet David.Handke Freitag, 22. Juni 2012 14:05 typo
    • Als Antwort markiert SSeilmann Montag, 25. Juni 2012 13:24
    Freitag, 22. Juni 2012 14:05
  • Danke David!

    Offenbar war ich kurz bewusstlos, als ich den Code geschrieben habe...

    Montag, 25. Juni 2012 13:23