usos tipo runtimebinderexception runtimebinder puede programacion microsoft los invocar funciones funcionan funcion eventos ejemplo delegate delegados delegado csharp concepto como anonimas c# multithreading delegates

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.