Hi,
ich öffne über ein Contextmenu ein neues Tab in einem Tabcontrol.
Mein Problem ist nun dass das Event das mit dem ContextmenuItem verknüpft ist ca 5-10mal aufgerufen wird, was natürlich zur folge hat das ebenso viele Tabs geöffnet werden.
Im moment umgehe ich das ganze mit einem kurzen Timer und einem busy Flag in der Art:
bool NewObjectToolStripMenuItem_Click_Busy = false;
private void NewObjectToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!NewObjectToolStripMenuItem_Click_Busy)
{
NewObjectToolStripMenuItem_Click_Busy = true;
machwas();
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(delegate
{
NewObjectToolStripMenuItem_Click_Busy = false;
timer.Stop();
}
);
timer.Interval = 500;
timer.Start();
}
}
Das funktioniert zwar, aber schön ist es nicht 😃
Fällt einem da spontan eine bessere möglichkeit ein?
warpi
Im moment umgehe ich das ganze mit einem kurzen Timer und einem busy Flag in der Art:
ja, so macht man das in der microcontrollertechnik.
aber nciht in c# auf dem desktop einer normalen software...
Fällt einem da spontan eine bessere möglichkeit ein?
ich würde spontan behaupten, das dein eventhandler 5-10 mal registriert ist. das einfachste in so einem fall ist, sich immer vor der registrierung eine unregistrierung durchzuführen. so kann man sicherstellen, das man immer nur ein mal registriert ist.
edit: ach ja und deine "flag" geschichte würde dir in einer multicore umgebung im release code ganz schnell böse überraschungen bereiten.... mach dich über das "volatile" schlüsselwort her 😉
Hallo warpi,
die entscheidende Frage ist doch warum das Event 10 mal kommt!
Eine trotzdessen bessere Möglichkeit wäre in meinen Augen dich von dem Event abzumelden, wenn du es jedoch danach wieder brauchst dann ist das auch keine Lösung. Wobei wir wieder bei der Frage der 10 Events sind, weil ein Click event sollte nur einmal pro click kommen.
Kann es vielleicht sein das du dich mehrmals an das Event angemeldet hast?
[edit] Jack war schneller.
Again what learned...
ihr beiden habt recht, ich habs wirklich immer wieder registriert mit hand an kopf hau
Wenn ichs vorher deregistriert klappts einwandfrei.
Danke für die schnelle Hilfe 😃
Und das mit volatile werd ich mir auch mal zu Gemüte führen. thx
warpi
Wenn ichs vorher deregistriert klappts einwandfrei. und kannst dus nicht genau einmal registrieren, zb im konstruktor, oder im Form_Load?
edit: dann braucht man auch nix mit multicore und Flags und volatile, sondern wenns klickt flutschtes. 😉
Der frühe Apfel fängt den Wurm.
Jap, kann ich machen und hab ich inzwischen auch gemacht. 😃
Ich baue das Contextmenu dynamisch zusammen und hatte deshalb die Event Registrierung mit in die Methode gepackt in der das Menu aufgebaut wird.
Ich weiss auch nicht mehr was ich mir dabei gedacht habe ^^
Gruß,
warpi