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

Beitrag lesen

Hi,
sorry ich war leider weg, aber nun:

Danke! Also:

Das ganze Programm selber soll sozusagen ein Server-Client Programm sein.
Also: Man gibt in den Textfeldern die ganzen Informationen ein und nach einem Klick auf den Okay-Button schickt das Programm die ganzen Informationen verschlüsselt an den Server und bekommt die Antwort als XML-Format. Diese Wertet das Programm dann aus und je nachdem ob das Login erfolgreich war oder nicht kommt dann halt eine Meldung oder man wird wieder zurück zum Login gebracht.

Während die Antwort des Servers erwartet wird soll da ein Ladebalken sein und ein Textblock wo der Text halt immer aktualisiert werden soll (der Momentane Status, also z.B.: "Verbinde...","Erfolgreich Verbunden!","Logge ein...","Lade Informationen herunter...",... usw.).

  1. anmelden() => reduzieren

Ich habe schon die Anmelde Methode soweit reduziert wie es nur geht aber das Problem ist:
Ich kann ja nicht wissen wie lange es dauert bis der Server antwortet.

Den

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

-Teil (ist jetzt entfernt) habe ich unabsichtlich gemacht, weil das f.anmelden(username.Text,pw.Text,this);
eigentlich einen Rückgabe-Wert liefert (ist der Rückgabewert null so ist das Login fehlgeschlagen, ist er es nicht, wird das Ergebnis ausgearbeitet) was auch der Grund ist warum ich die Schleife gemacht habe: Damit er genau das macht! (Rückgabewerte überprüfen)
Ich habe diese Überprüfungen nun aber in den Thread eingebaut, damit die GUI nicht einfriert.

  
Task.Factory.StartNew(() => {  
Dispatcher.Invoke(new Action(() => threadMethode() ));  
});  

(Die threadMethode() ruft das f.anmelden() auf und wertet auch gleich das Ergebnis aus [ist aber alles in einem anderen Thread, wodurch der Hauptthread und die GUI nicht einfrieren sollten].)

Nun ist nur noch folgendes Problem: Die Schleife ist raus. Die letzte Methode die im Hauptthread aufgerufen wird ist die, die den Thread startet.
Irgendwie friert aber jetzt komischerweise der zweite Thread die GUI vom Hauptthread ein!

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.

Ich habe mich erkundigt und jemand hat mir vorgeschlagen das Ganze mit einem Binding zu machen. So würde ich nicht direkt auf die Oberflächenelemente zugreifen:

  
<TextBlock FontSize="12" Text="{Binding Source={StaticResource status}, Path=Status}" />  
  
  
<!-- Damit würde ich jetzt den Inhalt ändern: -->  
<Window.Resources>  
<ObjectDataProvider x:Key="status" ObjectType="{x:Type local:Statusklasse}" />  
</Window.Resources>  

Die Statusklasse:

  
class Statusklasse : INotifyPropertyChanged  
{  
    public event PropertyChangedEventHandler PropertyChanged;  
    private String status;  
    public String Status  
    {  
       get { return status; }  
       set  
       {  
             now = value;  
             if (PropertyChanged != null)  
                    PropertyChanged(this, new PropertyChangedEventArgs("Status"));  
        }  
    }  
  
    ...  

Nur ist das Problem:
Ein Timer wird öfters ausgeführt. Ich will ihn aber nur einmal starten (genau dann, wenn ich auf den Button drücke!).
Also wurde mir der Backgroundworker vorgeschlagen, aber der soll nur für kurze Ausführungen genutzt werden!

Die anmelde-Methode verbindet sich öfters mit den Server. (Zuerst meldet das Programm sich am Server an, dann ladet es die Serverinformationen herunter und dann ein Bild vom Server: Also 3 mal insgesamt).

Die Person hat mir dann vorgeschlagen irgendwelche asyncron-Methoden vom WebClient zu benutzen, die dann Melden, wenn der Server antwortet.

So zerlegt sich dann aber die ursprüngliche Methode (f.anmelden(username.Text,pw.Text,this);) in lauter kleine Methoden!

Kann ich nicht einfach eine EINZIGE Methode machen, die sich um alles kümmert?
(
Verbinden, Antwort vom Server bearbeiten, GUI aktualisieren,
Verbinden, Antwort vom Server bearbeiten, GUI aktualisieren,
...)

Was soll ich machen?

LG Mawin