Como Invoke/ BeginInvokeacepta Delegate(en lugar de un delegado con tipo), debe 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:
¿Cómo puedo pasar parámetros a su primera solución en esta respuesta? Me refería a esta solución: control.Invoke ((MethodInvoker) delegate {this.Text = "Hi";});
uzay95
1
¿Por qué se invoca el Método de extensión sin tener que hacer una conversión explícita a la acción?
P.Brian.Mackey
Porque el compilador puede inferir eso del uso.
RoboJ1M
1
Es lo mismo que poder hacer en Form.Load += Loader()lugar de lo viejoForm.Load += new EventHandler(Loader())
RoboJ1M
49
En realidad, no necesita usar la palabra clave delegado. Simplemente pase lambda como parámetro:
Necesita crear un tipo de delegado. La palabra clave 'delegar' en la creación del método anónimo es un poco engañosa. No está creando un delegado anónimo, sino un método anónimo. El método que creó puede usarse en un delegado. Me gusta esto:
En aras de la integridad, esto también se puede lograr a través de una combinación de método de acción / método anónimo:
//Process is a method, invoked as a method groupDispatcher.Current.BeginInvoke((Action)Process);//or use an anonymous methodDispatcher.Current.BeginInvoke((Action)delegate=>{SomeFunc();SomeOtherFunc();});
Invoke((Action) Process);es la mejor respuesta, gracias!
Jinjinov
5
Tuve problemas con las otras sugerencias porque a veces quiero devolver valores de mis métodos. Si intenta utilizar MethodInvoker con valores de retorno, no parece que le guste. Entonces, la solución que uso es así (muy feliz de escuchar una manera de hacer esto más sucinto: estoy usando c # .net 2.0):
// Create delegates for the different return types needed.privatedelegatevoidVoidDelegate();privatedelegateBooleanReturnBooleanDelegate();privatedelegateHashtableReturnHashtableDelegate();// Now use the delegates and the delegate() keyword to create // an anonymous method as required// Here a case where there's no value returned:publicvoidSetTitle(string title){
myWindow.Invoke(newVoidDelegate(delegate(){
myWindow.Text= title;}));}// Here's an example of a value being returnedpublicHashtableCurrentlyLoadedDocs(){return(Hashtable)myWindow.Invoke(newReturnHashtableDelegate(delegate(){return myWindow.CurrentlyLoadedDocs;}));}
// Thread-safe update on a form controlpublicvoidDisplayResult(string text){if(txtResult.InvokeRequired){
txtResult.Invoke((Action)delegate{DisplayResult(text);});return;}
txtResult.Text+= text +"\r\n";}
Bonificación: agregue algo de manejo de errores, porque es probable que, si está utilizando Control.Invokeun subproceso en segundo plano, esté actualizando el texto / progreso / estado habilitado de un control y no le importe si el control ya está dispuesto.
Form.Load += Loader()
lugar de lo viejoForm.Load += new EventHandler(Loader())
En realidad, no necesita usar la palabra clave delegado. Simplemente pase lambda como parámetro:
fuente
fuente
Necesita crear un tipo de delegado. La palabra clave 'delegar' en la creación del método anónimo es un poco engañosa. No está creando un delegado anónimo, sino un método anónimo. El método que creó puede usarse en un delegado. Me gusta esto:
fuente
En aras de la integridad, esto también se puede lograr a través de una combinación de método de acción / método anónimo:
fuente
Invoke((Action) Process);
es la mejor respuesta, gracias!Tuve problemas con las otras sugerencias porque a veces quiero devolver valores de mis métodos. Si intenta utilizar MethodInvoker con valores de retorno, no parece que le guste. Entonces, la solución que uso es así (muy feliz de escuchar una manera de hacer esto más sucinto: estoy usando c # .net 2.0):
fuente
Me gusta usar Action en lugar de MethodInvoker, es más corto y se ve más limpio.
P.ej.
fuente
Nunca entendí por qué esto hace una diferencia para el compilador, pero esto es suficiente.
Bonificación: agregue algo de manejo de errores, porque es probable que, si está utilizando
Control.Invoke
un subproceso en segundo plano, esté actualizando el texto / progreso / estado habilitado de un control y no le importe si el control ya está dispuesto.fuente