Simon: C-Sharp: Zugriff durch Thread auf ein Objekt verweigert bei WPF

Beitrag lesen

Moin,

..., da beim Invoke nur ein Befehl ausgeführt werden darf.

ehm ja eine Aktion, aber darin kannst du ja mehrere Anweisungen unterbringen.

  
  Task.Factory.StartNew(() => {  
    Dispatcher.Invoke(new Action(() => {  
      f.anmelden(username.Text,pw.Text,this);  
      wasauchimmer();  
      undsoweiter();  
    }));  
  });  

Da aber dank der Dispatcher.Invoke die Methode gar nicht erst gestartet wird und somit kein
"threadlaeuft = false;" stattfindet, läuft der

while (threadlaeuft)
{
     Thread.Sleep(100);
}

genau diese Stelle blockiert ja auch den Main-Thread und ich weiß auch gar nicht, warum du das hier so machst. Dispatcher ist gut, glaube das ist das WPF-Pedant zu der Forms-Invoke Geschichte.

Jedenfalls kann die Aufgabe nicht an den Main-Thread überreicht werden, weil der ja durch deine while-Schleife und Thread.Sleep blockiert wird.

So ganz genau habe ich jetzt noch nicht verstanden, was du mit "Login-Seite-Einbinden" meinst. In WPF deklarierst du ja deine Oberfläche mit all den Elementen (xaml) und bindest sie an Felder oder was auch immer aus deiner Klasse. Bei Änderungen der Felder in deiner Klasse werden die Oberflächenelemente automatisch aktualisiert und/oder auch umgekhert (TwoWayBinding etc. sowie auch DependencyProperty, sind jetzt nur Stichwörter zum Suchen).

Nimm jetzt einfach mal die while-Schleife raus und reduziere die Anmelden-Methode auf ein Minimum. Was macht die eigentlich genau? Schaffst du mit MVVP und Webdiensten? Na wie auch immer.

1. while + Sleep => raus
2. anmelden() => reduzieren

PS: Bei WPF ist es sinnvoll, nicht direkt auf die Oberflächenelemente zuzugreifen. Ändere Werte deines Modells und binde das Modell an deine Deklaration für die Oberfläche. Das ist fast so wie Javascript und CSS. Man hat es getrennt.

Gruß