Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MVVM Aktualisierung von Eigenschaften durch Task.Factory
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.433

beantworten | zitieren | melden

Hallo Dominicano,

du fragst ja auch die UI-Komponente noch im Background-Thread (und nicht im UI-Thread) ab:


if (... && LampenLabel[j].BackgroundColor == Color.Red && ...)
Packe also diese Abfrage innerhalb des Dispatcher-Codes.

Und


LampenLabel[0]
ist sicherlich ein Fehler (im ersten Dispatcher-Code) und du möchtest


LampenLabel[j]

Außerdem vermischt du generell hier Logik und UI-Code, das sollte man vermeiden.
Also befolge Abt's Rat und steige auf MVVM (DataBinding) um - das direkt Arbeiten mit verschiedenen Threads ist, wie du siehst, sehr fehleranfällig.

PS: Auch den Schreibzugriff auf die Variable j führst du in unterschiedlichen Threads aus (die Anweisung j++ führst du doch logisch jedesmal aus, also reicht diese Anweisung einmalig auszuführen - nach if ... else).
private Nachricht | Beiträge des Benutzers
Dominicano
myCSharp.de - Member



Dabei seit:
Beiträge: 23
Herkunft: Dajabon

beantworten | zitieren | melden

Hi Th69

Ja, LampenLabel[0] war falsch.
Also :


private bool UpdateLabel1()
        {
            if (j < 32 && LampenLabel[j].BackgroundColor == Color.Red && Lampen[j])
                Device.BeginInvokeOnMainThread(async () =>
                {
                    LampenLabel[j].BackgroundColor = Color.Green;
                    //System.Diagnostics.Debug.WriteLine("Label geändert zu grün: " + j);
                    j++;
                });

            else if (j < 32 && LampenLabel[j].BackgroundColor == Color.Green & !Lampen[j])
                Device.BeginInvokeOnMainThread(async () =>
                {
                    LampenLabel[j].BackgroundColor = Color.Red;
                    //System.Diagnostics.Debug.WriteLine("Label geändert zu rot: " + j);
                    j++;
                });
            else
                j++;
            if (j > 31)
            {
                j = 0;
                return false;
            }
            else
                return true;
        }
funktioniert auf Android-Geräten, Windows 8.1 , 10 und Phone reibungslos. IOS kann ich mangels IPhone oder Mac nicht testen. Nur bei Windows IoT auf dem RasPi halt nicht. (Liegt es an Windows? Selbst bei der Serververbindung bekomme ich teilweise SoketExceptions wo nie welche kamen...)

"j" mußte außerhalb deklariert werden da eine for-Schleife nur Exceptions brachte


private bool UpdateLabel4() // funktioniert nicht!
        {
            Device.BeginInvokeOnMainThread(async () => {
            for (int i = 1; i < 32; i++)
                if (LampenLabel[i].BackgroundColor == Color.Red && Lampen[i])
                    LampenLabel[i].BackgroundColor = Color.Green;
                else if (LampenLabel[i].BackgroundColor == Color.Green & !Lampen[i])
                    LampenLabel[i].BackgroundColor = Color.Red; 
            });
            return false;
        }


Binding der BackgroundProperty habe ich heute auch versucht. Laut Debug werden die Farben geändert , nur in der Gui nicht.

Habe evtl. einen leichteren Weg gefunden: (eine schon früher geschriebene) Win-Forms.exe läßt sich auch (mit zwei zusätzlichen Programmen) so auf dem PI ausführen.
Evtl. braucht es ja mal jemand:https://tutorials-raspberrypi.de/raspberry-pi-gui-apps-c-sharp-dot-net/
private Nachricht | Beiträge des Benutzers