Laden...

Control.Invoke() ohne Methode?

Erstellt von EL_Broto vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.860 Views
E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren
Control.Invoke() ohne Methode?

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

2.082 Beiträge seit 2005
vor 15 Jahren

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

4.221 Beiträge seit 2005
vor 15 Jahren

anonyme delegates

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

5.742 Beiträge seit 2007
vor 15 Jahren

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.

E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

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.

2.082 Beiträge seit 2005
vor 15 Jahren

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

3.971 Beiträge seit 2006
vor 15 Jahren

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...

E
EL_Broto Themenstarter:in
55 Beiträge seit 2008
vor 15 Jahren

kann mir jemand da jetzt ein konkretes beispiel geben, wie das funktioniert?
blick das einfach nicht 🙁

5.742 Beiträge seit 2007
vor 15 Jahren

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!";  
}  
  
5.299 Beiträge seit 2008
vor 15 Jahren

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.

3.971 Beiträge seit 2006
vor 15 Jahren

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...