Laden...

Über Multithreading Controls erstellen gibt InvalidOperationException

Erstellt von xKushGene vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.057 Views
X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren
Über Multithreading Controls erstellen gibt InvalidOperationException

Guten Tag.

Ich habe mehrere Kategorien, in denen ich weitere Kategorien hinzufügen will. Das läuft alles über die Datenbank.

Als erstes werden die Hauptkategorien als Expander im Code erstellt.
Nun sollen diese Expander ein TreeView bekommen, in denen die Unterkategorien hinein sollen.

Dafür habe ich bis jetzt folgenden Code:

while(reader.Read())
                    {
                        int categoryID = (int)reader["id"];

                        Expander cat_expander = new Expander();
                        cat_expander.ExpandDirection = ExpandDirection.Right;
                        TextBlock cat_name = new TextBlock();
                        cat_name.Text = reader["name"].ToString();
                        cat_name.RenderTransformOrigin = new Point(0.5, 0.5);
                        cat_name.LayoutTransform = new RotateTransform() { Angle = 90 };
                        cat_expander.Header = cat_name;

                        Thread t = new Thread( () => LoadUnderCategories(categoryID) );
                        t.Start();
                        t.Join();

                        Border border = new Border();
                        border.Width = 1;
                        border.VerticalAlignment = VerticalAlignment.Stretch;
                        border.SnapsToDevicePixels = true;
                        border.Background = (Brush)FindResource("MaterialDesignDivider");

                        cat_expander.Content = serviceList;
                        serviceListSP.Children.Add(cat_expander);
                        serviceListSP.Children.Add(border);

                        serviceList.Items.Clear();
                    }

Meine LoadUnderCategories sieht wie folgt aus:

private void LoadUnderCategories(int categoryID)
        {
            connection = new MySqlConnection(conf.connection_string);
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = connection;
            cmd.CommandText = "SELECT * FROM auftrags_typ_childcategory WHERE category = @categoryID";
            cmd.Parameters.AddWithValue("@categoryID", categoryID);

            if(this.OpenConnection() == true)
            {
                try
                {
                    MySqlDataReader reader = cmd.ExecuteReader();
                    while(reader.Read())
                    {
                        TreeViewItem child_category = new TreeViewItem();
                        child_category.Header = reader["name"].ToString();
                        serviceList.Items.Add(child_category);
                    }
                }
                catch(MySqlException ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

Nun erkläre ich mein Vorgehen.
Ich möchte im hauptdurchgang (im ersten Code) den Code pausieren, weshalb ich einen Thread erstellt habe und mit Join pausiere. serviceList ist eine globale Variable (TreeView).
In dem Thread der aufgerufen wird, lese ich alle Items aus der Datenbank, welche den "category" wert der übermittelten id haben und packe sie in das TreeView. Wenn der Thread fertig ist, fügt die StartMethode noch einen Border hinzu und die added die controls den panels.

Sieht für mich eigentlich logisch aus, aber ich bekomme folgenden Fehler beim ausführen des Codes:

Fehlermeldung:
"System.InvalidOperationException" ist in PresentationCore.dll aufgetreten.

Zusätzliche Informationen: Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies für viele Komponenten der Benutzeroberfläche erforderlich ist.

Ich kann mit der Meldung leider überhaupt nichts anfangen.
Die Meldung wirft er mir bei:

TreeViewItem child_category = new TreeViewItem();

in LoadUnderCategories.

Hat hier vielleicht jemand eine Ahnung, wie ich diesen Fehler beheben kann?

3.003 Beiträge seit 2006
vor 7 Jahren

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)