visual valid tag method example documentacion description cref comment comentarios c# .net compiler-errors anonymous-methods

valid - summary tag in c#



Método anónimo en Invocar llamada (6)

Como Invoke / BeginInvoke acepta Delegate (en lugar de un delegado tipeado), necesita decirle al compilador qué tipo de delegado crear; MethodInvoker (2.0) o Action (3.5) son opciones comunes (tenga en cuenta que tienen la misma firma); al igual que:

control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});

Si necesita pasar parámetros, entonces las "variables capturadas" son la forma:

string message = "Hi"; control.Invoke((MethodInvoker) delegate {this.Text = message;});

(advertencia: debes ser un poco cauteloso si usas capturas asincrónicas , pero la sincronización es correcta , es decir, lo anterior está bien)

Otra opción es escribir un método de extensión:

public static void Invoke(this Control control, Action action) { control.Invoke((Delegate)action); }

entonces:

this.Invoke(delegate { this.Text = "hi"; }); // or since we are using C# 3.0 this.Invoke(() => { this.Text = "hi"; });

Por supuesto, puede hacer lo mismo con BeginInvoke :

public static void BeginInvoke(this Control control, Action action) { control.BeginInvoke((Delegate)action); }

Si no puede usar C # 3.0, podría hacer lo mismo con un método de instancia regular, presumiblemente en un Form de clase base.

Tener un problema con la sintaxis en la que queremos llamar a un delegado de forma anónima dentro de Control.Invocar.

Hemos intentado una serie de enfoques diferentes, todo fue en vano.

Por ejemplo:

myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); });

donde algún parámetro es local para este método

Lo anterior dará como resultado un error de compilación:

No se puede convertir el método anónimo para escribir ''System.Delegate'' porque no es un tipo de delegado


En aras de la exhaustividad, esto también se puede lograr a través de una combinación método de acción / método anónimo:

//Process is a method, invoked as a method group Dispatcher.Current.BeginInvoke((Action) Process); //or use an anonymous method Dispatcher.Current.BeginInvoke((Action)delegate => { SomeFunc(); SomeOtherFunc(); });


En realidad, no es necesario utilizar la palabra clave delegar. Solo pase lambda como parámetro:

control.Invoke((MethodInvoker)(() => {this.Text = "Hi"; }));


Necesita crear un tipo de delegado. La palabra clave ''delegar'' en la creación de métodos anónimos es un poco engañosa. No está creando un delegado anónimo, sino un método anónimo. El método que creó se puede usar en un delegado. Me gusta esto:

myControl.Invoke(new MethodInvoker(delegate() { (MyMethod(this, new MyEventArgs(someParameter)); }));


Tuve problemas con las otras sugerencias porque a veces deseo devolver valores de mis métodos. Si intenta utilizar MethodInvoker con valores devueltos, parece que no le gusta. Entonces la solución que uso es así (muy feliz de escuchar una manera de hacer esto más breve, estoy usando c # .net 2.0):

// Create delegates for the different return types needed. private delegate void VoidDelegate(); private delegate Boolean ReturnBooleanDelegate(); private delegate Hashtable ReturnHashtableDelegate(); // Now use the delegates and the delegate() keyword to create // an anonymous method as required // Here a case where there''s no value returned: public void SetTitle(string title) { myWindow.Invoke(new VoidDelegate(delegate() { myWindow.Text = title; })); } // Here''s an example of a value being returned public Hashtable CurrentlyLoadedDocs() { return (Hashtable)myWindow.Invoke(new ReturnHashtableDelegate(delegate() { return myWindow.CurrentlyLoadedDocs; })); }


myControl.Invoke(new MethodInvoker(delegate() {...}))