Laden...

ComboBox mit TableAdapter.Fill() & Thread

Erstellt von SeriouslyNot vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.233 Views
Thema geschlossen
S
SeriouslyNot Themenstarter:in
13 Beiträge seit 2013
vor 9 Jahren
ComboBox mit TableAdapter.Fill() & Thread

Hallo,

ich möchte gern eine ComboBox im Hintergrund mit Daten füllen. Mein bisheriger Ansatz sieht so aus:


Thread threadDB = new Thread(delegate() { getDataBase(); });
threadDB.Start();

private void getDataBase()
{
comboBox1.Invoke((MethodInvoker)(() => {   this.TableAdapter.Fill(this.DataSet.Test);}));
}

Leider bleibt die ComboBox leer und eine Exception gibts auch nicht. Was mache ich falsch?

4.939 Beiträge seit 2008
vor 9 Jahren

Hallo,

so bringt das gar nichts, da du mittels Invoke wieder das gesamte Laden der Daten im GUI-Thread ausführst.
Du mußt erst die Daten in einem anderen Thread laden und nur die DataSource-Zuweisung (für die ComboBox) im GUI-Thread durchführen.
Anstatt eines manuellen Threads benutze aber besser die Task-Klasse.
Ab C# 5.0 (.NET 4.5) kannst du auch asynchrone Methoden mittels der Schlüsselwörter "async" und "await" erzeugen, welche dann mittels Compilermagie den GUI-Thread bedienbar lassen (während die Hintergrundaktion durchgeführt wird): Asynchronous Programming in C# 5.0 using async and await

S
SeriouslyNot Themenstarter:in
13 Beiträge seit 2013
vor 9 Jahren

Vielen Dank für die Hilfe. So hat es geklappt:

                
Thread threadDB = new Thread(delegate() { getDataBase(); });
threadDB.Start();

private void getDataBase()
{
this.TableAdapter.Fill(this.DataSet.Test);

comboBox1.Invoke((MethodInvoker)(() =>
                {
                    this.comboBox1.DataSource = this.DataSet.Test;
                    this.comboBox1.DisplayMember = "Name";
                    this.comboBox1.ValueMember = "ID";
                  
                }));
}
Hinweis von herbivore vor 9 Jahren

Das wäre auch aus der FAQ hervorgegangen, siehe [FAQ] Warum blockiert mein GUI?, Abschnitt "Die Falle". Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.

Thema geschlossen