ist es möglich, einen Control.Invoke() aufzurufen, ohne extra eine neue Methode dafür zu generieren?
ist ziemlich nervig, wenn man da immer nur ein kommando drinne hat
mfg EL_Broto
Hallo EL_Broto,
in einer Form BSP:
this.BeginInvoke(new EventHandler( delegate {
//dein Code
}));
//Oder z. B. für einen BackgroundWorker
bgWorker.DoWork += new DoWorkEventHandler(delegate(object sender, DoWorkEventArgs e) {
//Dein Code
});
Aber solcher Code ist mit vorsicht zu behandeln
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
anonyme delegates
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo EL_Broto,
in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) ruft herbivore die Methode selbst auf, wenn InvokeRequired true ist - auf diese Weise reicht eine Methode.
Alternativ kannst du auch anonyme Methoden, wie ja schon Programmierhans vorgeschalgen hat, oder Lamba Ausdrücke verwenden.
was ist an folgendem code dann falsch?
if (this.InvokeRequired)
{
this.Invoke(delegate { myClass.MyProp = 1; });
}
bekomm folgende fehlermeldung:
"anonyme Methode" kann nicht in den Typ "System.Delegate" konvertiert werden, da dies kein Delegattyp ist.
Schau dir doch mal meinen Post genau an, dann fällts dir vielleicht auf.
Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de
Bei Control.Invoke musst du zwingend einen Typen angeben siehe dazu Konvertierung anonyme Delegates => Delegates und auch die Beiträge vorher.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
kann mir jemand da jetzt ein konkretes beispiel geben, wie das funktioniert?
blick das einfach nicht 🙁
kann mir jemand da jetzt ein konkretes beispiel geben, wie das funktioniert?
blick das einfach nicht 😦
Aus dem von mir genannten FAQ-Beitrag:
Mit Control.InvokeRequired kann man abfragen, ob ein Aufruf von Control.Invoke/BeginInvoke nötig ist. Dadurch kann man Methoden nach folgendem Muster schreiben, ...
void DoCheapGuiAccess () { if (ctrl.InvokeRequired) { // Wenn Invoke nötig ist, ... // dann rufen wie die Mehode selbst per Invoke auf ctrl.Invoke (new MethodInvoker (DoCheapGuiAccess)); return; } // eigentlicher Zugriff; läuft jetzt auf jeden Fall im GUI-Thread ctrl.Text = "Hello World!"; }
Ja, aber mit den erwähnten anonymen Methoden gehtsn Stück eleganter:
void DoCheapGuiAccess(string txt) {
Action action = () => ctrl.Text = txt; //auszuführende Aktion definieren
if (ctrl.InvokeRequired) ctrl.BeginInvoke(action); //invoken...
else action(); //...oder direkt
}
Der frühe Apfel fängt den Wurm.
oder
ctrl.Invoke (new MethodInvoker (delegate (object state ) { //Argument muss je nach basierenden Delegattyp angelegt werden
...
// je nach Delegattyp noch ein return xyz.
}
), null); // angabe der entsprechenden Parameter für den Delegattyp
Dies Funktion ab DOT NET Version 2.0
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...