C# Auf Objekt zugreifen (anderer Thread)

Nick_SMI

Ensign
Registriert
Sep. 2015
Beiträge
153
Hallo zusammen!

Folgender Code soll den Benutzer anmelden, während die ProgressBar aktiv läuft:

Code:
Task.Run(() =>
            {
                Dispatcher.Invoke(() =>
                {
                    ProgressStatus.IsActive = true;
                });
                Pruefen();
            });

Code:
private void Pruefen()
        {
            MySqlConnection con = new MySqlConnection();
            MySqlCommand cmd = new MySqlCommand();

            con.ConnectionString =
                "Data Source=x ;" +
                "Initial Catalog=y;UID=xx;password=y";

            cmd.Connection = con;

            try
            {
                con.Open();
                cmd.CommandText = ("SELECT count(*) FROM VestDispos where BINARY Name = '" + Disponent.Text + "' ");

                if (Convert.ToInt32(cmd.ExecuteScalar()) != 0)
                {
                    Anmeldung();
                }
                else
                {
                    Fehler("Der Disponent konnte nicht gefunden werden!", "Disponent nicht gefunden!");
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Fehler bei der Verbindung (Entry or connection setup by try-catch is failed)", MessageBoxButton.OK, MessageBoxImage.Stop);
            }
            con.Close();
        }

        private void Anmeldung()
        {
            MySqlConnection con = new MySqlConnection();
            MySqlCommand cmd = new MySqlCommand();
            MySqlDataReader reader;

            con.ConnectionString =
                "Data Source=x ;" +
                "Initial Catalog=y;UID=xx;password=y";

            cmd.Connection = con;

            try
            {
                con.Open();
                cmd.CommandText = "SELECT * FROM `VestDispos` WHERE BINARY Name = '" + Convert.ToString(Disponent.Text) + "' ";
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    if (Convert.ToString(Passwort.Password) == Convert.ToString(reader["Passwort"]))
                    {
                        Window1 fu = new Window1(this);
                        fu.ShowDialog();
                        this.Close();
                    }
                    else
                    {
                        Fehler("Das Passwort ist falsch!", "Fehler!");
                    }
                }
                reader.Close();
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Fehler bei der Verbindung (Entry or connection setup by try-catch is failed)", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }

Doch ich kriege ein Fehler, dass auf das Objekt Disponent.Text nicht zugegriffen werden kann...
Wie änder ich den Code am besten, dass beides gut und flüssig läuft?

Grüße und Frohe Weihnachten!
 
Ganz oben wird Dispatcher.Invoke verwendet um auf das ProgressStatus UI Element zuzugreifen. Das musst du auch bei allen anderen Zugriffen aus dem Task heraus auf UI Komponenten machen, wie eben bei Disponent.Text. Wobei es hier mehr Sinn macht vor der Ausführung des Tasks den entsprechenden Wert noch im UI Thread auszulesen und in einer Variable zu speichern. Die kannst du dann im Task verwenden. Denk auch dran, dass du nicht blind Copy & Paste verwendest ;) Achte drauf, dass du weißt, was dein Code tut. Die MSDN Dokumentation ist super. Das kann man sich ruhig mal geben =) Siehe: https://msdn.microsoft.com/de-de/li...ing.dispatcher.invoke(v=vs.110).aspx#Anchor_1 :)
 
Zuletzt bearbeitet:
Zurück
Oben