Según lo que he encontrado en C#, el método Control.Invoke requiere que use un delegado sin parámetros de entrada. ¿Hay alguna forma de evitar esto? Me gustaría invocar un método para actualizar la UI desde otro hilo y pasarle los parámetros de cadena.Control.Invocar con entrada Parámetros
Respuesta
¿Qué versión de C# estás usando? Si está usando C# 3.5, puede usar cierres para evitar pasar parámetros.
con C# 3,5public static class ControlExtensions
{
public static TResult InvokeEx<TControl, TResult>(this TControl control,
Func<TControl, TResult> func)
where TControl : Control
{
return control.InvokeRequired
? (TResult)control.Invoke(func, control)
: func(control);
}
public static void InvokeEx<TControl>(this TControl control,
Action<TControl> func)
where TControl : Control
{
control.InvokeEx(c => { func(c); return c; });
}
public static void InvokeEx<TControl>(this TControl control, Action action)
where TControl : Control
{
control.InvokeEx(c => action());
}
}
con seguridad invocando código ahora se convierte en trivial.
this.InvokeEx(f => f.label1.Text = "Hello World");
this.InvokeEx(f => this.label1.Text = GetLabelText("HELLO_WORLD", var1));
this.InvokeEx(() => this.label1.Text = DateTime.Now.ToString());
con C# 2.0 se convierte en menos trivial
public class MyForm : Form
{
private delegate void UpdateControlTextCallback(Control control, string text);
public void UpdateControlText(Control control, string text)
{
if (control.InvokeRequired)
{
control.Invoke(new UpdateControlTextCallback(UpdateControlText), control, text);
}
else
{
control.Text = text;
}
}
}
El uso sea sencillo, pero hay que definir más devoluciones de llamada para más parámetros.
this.UpdateControlText(label1, "Hello world");
creo (excelente) El enfoque de Samuel puede ser empujado aún más:
Método de extensión: Código
public static void ExecuteAsync<TControl>(this TControl control, Action action)
where TControl : Control
{
new Thread(() =>
{
control.Invoke(action);
})
.Start();
}
Forma:
private void doStuff()
{
this.ExecuteAsync(() =>
{
// Do your stuff in a separate thread
// but having full access to local or instance variables.
// No (visible) threading code needs to be used here.
});
}
Como Lucas dice, usa Control.I nvoke así ...
Por ejemplo, en una forma:
public delegate void DelegatePassMessages(string name, int value);
public DelegatePassMessages passMessage;
En el contructor:
passMessage = new DelegatePassMessages (this.MessagesIn);
Entonces la función MessagesIn para recibir datos:
public void MessagesIn(string name, int value)
{
}
Entonces para pasar datos a su formulario:
formName.Invoke(formName.passMessage, new Object[] { param1, param2});
Encontré un método elegante para .net 2.0 con métodos anónimos envueltos en un delegado de MethodInvoker. De esa forma no es necesario definir delegados propios todo el tiempo.Ejemplo:
private void InitUI(Guid id, string typename)
{
MethodInvoker inv = delegate{tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);};
tvMatrix.Invoke(inv);
}
Por qué no
tvMatrix.Invoke((MethodInvoker) (() => {
tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);
}));
Algunos más posibilidades:
this.Invoke(new MethodInvoker(() => this.DoSomething(param1, param2)));
o
this.Invoke(new Action(() => this.DoSomething(param1, param2)));
o incluso
this.Invoke(new Func<YourType>(() => this.DoSomething(param1, param2)));
donde la primera opción es la mejor, porque MethodInvoker se concibe para ese propósito y tiene un mejor rendimiento.
Aquí puede usar expresiones lambda con la extensión Invoke() + un parámetro de entrada.
Uso: acción (db STARS)
_ccb.GetImagerFRU_PartNbr().Invoke(new Action<STARS>(dbase => _ccb.GetImagerFRU_PartNbr().Text = dbase.PartNumber(serial) ?? String.Empty), db);
private void ppTrace(string tv)
{
if (_Txb1.InvokeRequired)
{
_Txb1.Invoke((Action<string>)ppTrace, tv);
}
else
{
_Txb1.AppendText(tv + Environment.NewLine);
}
}
- 1. Control.Invocar vs tareas con un TaskScheduler
- 2. Filtros de Kalman con cuatro parámetros de entrada
- 3. ¿Cómo crear un servicio web tranquilo con parámetros de entrada?
- 4. F # Función Composición con entrada de múltiples parámetros
- 5. Función SQL sin parámetros de entrada
- 6. Parámetros nombrados con los parámetros
- 7. Asp.Net Mvc Los parámetros de entrada JQuery ajax son nulos
- 8. Atributos de C#: Usar constantes enum como parámetros de entrada
- 9. Parámetros de entrada múltiples para el método execute() de AsyncTask
- 10. Registro de entrada y salida de métodos junto con parámetros automágicamente?
- 11. alias con los parámetros
- 12. HQL con parámetros NoSuchMethodError
- 13. dibujable Android con parámetros
- 14. UIGraphicsBeginImageContext con los parámetros
- 15. ¿Pasar parámetros con call_user_func?
- 16. Parámetros opcionales con Specflow
- 17. performSelectorOnMainThread con múltiples parámetros
- 18. hilo con múltiples parámetros
- 19. Rieles: redirigir con parámetros
- 20. before_filter con parámetros
- 21. Router_Route con parámetros opcionales
- 22. Parámetros adicionales con socket.io
- 23. Controladores Web2py con parámetros?
- 24. Singleton con los parámetros
- 25. Selector con 2 parámetros
- 26. Activator.CreateInstance con parámetros opcionales
- 27. Ejecutar con los parámetros
- 28. ActionLink con múltiples parámetros
- 29. patrones de URL django con 2 parámetros
- 30. Google Guice: Proveedor con los parámetros