Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ComboBox mit TableAdapter.Fill() & Thread
SeriouslyNot
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

ComboBox mit TableAdapter.Fill() & Thread

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.593

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
SeriouslyNot
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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";
                  
                }));
}
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (16.10.2014 - 16:10)

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.