Heyho,
ich wusste nicht genau wo ich C# zuordnen sollte, ich hoffe es stört in diesem Themenbereich nicht.
Also:
Ich habe ein WPF-Projekt erstellt in der ich eine WPF-"login"-Page habe.
Die WPF-Page hat zwei TextBoxen (<TextBox>) (x:Name="username", x:Name="pw"), einen "Okay"-Button (<x:Name="ok">) und einen <TextBlock> (x:Name="status") in dem immer, falls was passiert, dies dann dort steht.
Wenn ich jetzt also auf den Button klicke, soll eine Methode aufgerufen werden die sozusagen das ganze Login behandelt.
Diese Methode befindet sich in der "Functions"-Klasse und sie hat als Übergabe-Parameter einen username-String, einen Passwort-String und die login page selber:
public class Functions
{
public void anmelden(String username, String pw, login l)
{
//das ganze Login
}
}
Diese eine Methode überprüft alles mögliche und ändert geg. den Status (im Textblock =====> <TextBlock x:Name="status"> =====> status.Text = neuerInhalt;).
Das würde dann in der Methode so ausschauen:
public void anmelden(String username, String pw, login l)
{
//vorhin
l.status.Text = "wasJetztPassiertIst";
//danach
}
Es soll die GUI aktualisieren.
Die Methode an sich funktioniert:
(KLASSE DER LOGIN-PAGE:)
public partial class login : Page
{
Functions f = new Functions();
threadlaeuft = false;//ob der Thread gerade laeuft oder nicht
public login()
{
InitializeComponent();
}
private void okayButtonWurdeGedrueckt(object sender, RoutedEventArgs e)
{
f.anmelden(username.Text,pw.Text,this);
}
}
Nur ist das Problem, dass die GUI einfriert bis die Methode zu Ende ausgeführt worden ist und nur sich dann erst aktualisiert.
Gut. Das Problem kenne ich schon von Java (GUI einfrieren, wenn die Methode länger braucht),
also habe ich mich über Threads erkundigt und bin auf den BackgroundWorker gekommen.
(Quelle: http://stackoverflow.com/questions/19928956/c-sharp-wpf-dispatcher-thread )
Also schaut die Methode jetzt so aus:
private void okayButtonWurdeGedrueckt(object sender, RoutedEventArgs e)
{
var worker = new BackgroundWorker();
worker.DoWork += (x, y) =>
{
f.anmelden(username.Text,pw.Text,this);
threadlaeuft = false; //Der Thread ist zu Ende
};
worker.RunWorkerAsync();
while(true)//damit er weiß, dass der Thread noch läuft oder auch nicht
{
Thread.Sleep(1);
if (threadlaeuft==false) //dann ist der Thread vorbei.
{
break;
}
}
}
Nun mein Problem:
Ich starte die Anwendung, fülle Werte die TextBoxen ein und drücke den Button.
Alles ist in Ordnung nur beim
f.anmelden(username.Text,pw.Text,this);
Teil wirft er beim "this" eine "InvalidOperationException" mit dem Text:
"Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."
Ja, im "this" (also der Login-Page) wird der Gui-Update Thread aufgerufen, somit darf ich von dem nicht auf das "this" (der Login-Page) zugreifen.
Aber wie soll ich sonst aus dem "this" ein bestimmtes Objekt rausbekommen (textbox) und genau dieses Aktualisieren (Inhalt)?
Ich habe auch die
new Thread(new ThreadStart(starteAnmeldung));
new Thread(new ParameterizedThreadStart(stateAnmeldung));
Möglichkeiten ausprobiert, aber immer, wenn er zum 'this' kommt, kommt diese Fehlermeldung.
Wie kann ich das Umgehen?
LG Mawin