Moin,
auf alle Oberflächenelemente sollte unter Windows aus dem Main-Thread zugegriffen werden. Nur dieser hat erstmal eine Message-Queue. Das heißt, die Elemente kommunizieren über Nachrichten und die Message-Queue ist sozusgagen der große Nachrichtensammeltopf (siehe PeekMessage, PumpMessage etc.). Wenn die Queue nicht abgearbeitet werden kann, dann friert deine Oberfläche ein. Ab Vista werden von Windows auch so Kontrollnachrichten versandt, um nachzuschau'n, ob die Anwendung noch reagiert (siehe ghost window, das hat bestimmt schon jeder gesehen).
Jetzt basiert WPF ja auf einen Visual-Three, aber ich denke auch dort trifft im Grunde das bereits genannte zu. Daher sollte deine Methode nicht ewig lang blockieren oder warten, weil ja sonst die Message-Queue nicht abgearbeitet wird.
Wenn du jetzt in einem anderen Thread auf die Oberflächenelemente zugreifen willst, dann solltest du das via Invoke machen, also die Aufgabe an den Main-Thread weiterleiten. Alles andere führt sonst zu ungewollten Ergebnissen (z.B. Seiteneffekte).
Beispiel Lösungsansatz (aus dem Kopf heraus):
protected void OnButtonOk(object sender, EventArgs e)
{
Task.Factory.StartNew(() => {
login(...); // Im Hintergrund
this.Invoke(new Action(() => textbox.text = "hallo")); // GUI aktualisieren
});
}
Du kannst auch mal nach InvokeRequired suchen, da wird auch so einiges erklärt, wie das zusammenhängt. Obiges Beispiel kannst du auch auf den BackgroundWorker ummünzen (der ist auch ein Hintergrund-Thread).
hth