tipo - Problema con la sintaxis de delegado en C#
funciones anonimas c# (2)
Creé un Testbox para aprender algo sobre el enhebrado en las aplicaciones de formularios de Windows. Silverlight y Java proporcionan el Dispatcher, que realmente ayuda a actualizar los elementos de GUI.
Ejemplos de código: delegado de clase de declaración
public delegate void d_SingleString(string newText);
Crear hilo
_thread_active = true;
Thread myThread = new Thread(delegate() { BackGroundThread(); });
myThread.Start();
Función de hilo
private void BackGroundThread()
{
while (_thread_active)
{
MyCounter++;
UpdateTestBox(MyCounter.ToString());
Thread.Sleep(1000);
}
}
Delegación de actualizaciones de TextBox
public void UpdateTestBox(string newText)
{
if (InvokeRequired)
{
BeginInvoke(new d_SingleString(UpdateTestBox), new object[] { newText });
return;
}
tb_output.Text = newText;
}
¿Hay alguna forma de declarar la Declaración del Delate en el método BeginInvoke?
algo como
BeginInvoke(*DELEGATE DECLARATION HERE*, new object[] { newText });
Muchas gracias, rAyt
En muchos casos como este, el enfoque más simple es usar una "variable capturada" para pasar el estado entre los hilos; esto significa que puede mantener la lógica localizada:
public void UpdateTestBox(string newText)
{
BeginInvoke((MethodInvoker) delegate {
tb_output.Text = newText;
});
}
Lo anterior es particularmente útil si esperamos que se InvokeRequired
en el hilo del trabajador (por lo tanto, poco control de InvokeRequired
) - tenga en cuenta que esto es seguro ya sea desde la interfaz de usuario o el hilo de trabajo, y nos permite pasar tanto o tan poco estado entre trapos.
Para delegados simples como este, puede usar el delegado de Action<T>
( enlace a msdn ) desde el marco.
public void UpdateTestBox(string newText)
{
if (InvokeRequired)
{
BeginInvoke(new Action<string>(UpdateTestBox), new object[] { newText });
return;
}
tb_output.Text = newText;
}
De esta forma, no necesita mantener sus propias declaraciones de delegado.