Hallo Leute,
Ich rufe einen Thread auf. Am Ende dieses Threads löse ich ein Event aus, und dieses event ist mit einer Methode verknüpft welche mir eine Combobox befüllen soll. Jetzt weiss ich nicht so recht wo ich dort das invoke einbindne soll bzw ob es einen besseren weg gibt.
Danke im Voraus.
Lg Tom
public static void load_table()
{
Thread database_transaction = new Thread(new ThreadStart(load_table_thread));
database_transaction.Start();
}
//Tabelle von DB laden
public static void load_table_thread()
{
err_str = DB_Handler.show_table(ref DS, tab_name, command);
if (err_str == "")
err_str = RM.GetString("msg_database_load");
events.Start_Evetn_1();
}
Und Start_Event_1 wird eien Methode aufgerufen welche die Combo füllt
Lg
Im Event-Handler, z.B:
private void MyEvent(object sender, EventArgs e) {
if(InvokeRequired) {
Invoke(new EventHandler(MyEvent), sender, e);
return;
}
// hier mit GUI-Elementen interagieren
}
du musst das Event ja irgendwo abonnieren. Und in der Methode, in der du das Event bearbeitest, machst du auch den Invoke.
das ganze sieht dann normalerweise so aus:
private void Start_Event_1_Handler()
{
if (InvokeRequired)
{
// Invoke, da wir nicht im UI-Thread sind
Invoke(new Start_Event_1_Delegate(Start_Event_1_Handler));
}
else
{
// Combobox befüllen, wir sind im UI-Thread
}
}
Dafür ist der Backgroundworker prima geeignet
Im RunWorkerCompleted Event füllste dann Deine ComboBox
Wenn du viel mit Threads zu tun hast, kannste auch die [ExtensionMethods] CrossThread-Calls verwenden, um das Event gleich im Gui-Thread zu raisen.
läuft dann auf sowas hinaus:
CrossThread.RunGui(OnMyXYEvent, MyXYEventArgs);
wo "ungethreaded" stünde:
OnMyXYEvent(MyXYEventArgs);
Sind auch Samples dabei
Der frühe Apfel fängt den Wurm.
Hallo carmani,
alles was du wissen musst, steht in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)
herbivore
Danke an alle für die Hilfe habs jetzt mit herbivore seiner Lösung umgesetzt, diese ist mir am einfachsten erschienen!
Thanks Tom