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?
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
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";
}));
}
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.