Usando delegados

He leído algunos de los conceptos básicos sobre el uso de delegados aquí

Publiqué una pregunta en SO y el siguiente código fue parte de la respuesta.

¿Se puede convertir esta sintaxis en una sintaxis más parecida al artículo de MSDN donde se declara explícitamente un delegado, etc. o, en determinadas circunstancias, es esta la única forma de codificarlo?

La razón por la que estoy buscando una forma alternativa de codificarlo es que, como novato en c #, encuentro que esta línea es difícil de entender. this.BeginInvoke(new MethodInvoker(delegate

private void myTimer_Elapsed(Object myObject,EventArgs myEventArgs){

        elapsedCounter++;
        elapsedTime = DateTime.Now.Subtract(startTime);

        if (elapsedTime.TotalMilliseconds < MaxTime)
        {
            this.BeginInvoke(new MethodInvoker(delegate
            {
                this.lblElapsedTime.Text = elapsedTime.ToString();

                if (elapsedCounter % 2 == 0)
                    this.lblValue.Text = EvenText;
                else
                    this.lblValue.Text = OddText;
            }));
        }
        else 
        {
            myTimer.Stop();
            myTimer.Dispose();
            //myProcess.Close();
        }
    } 

preguntado el 03 de mayo de 12 a las 08:05

la cosa es.. que declarar explícitamente un delegado...? ¿Qué tipo de sintaxis alternativa estás buscando? -

¡ups! +1 por tu diplomacia Marc. La sintaxis en el artículo de MSDN parece estar más detallada y me resulta más fácil comprender lo que está sucediendo. lo asumo this.BeginInvoke(new MethodInvoker(delegate está haciendo mucho, así que esperaba que una alternativa dividiera esto en más líneas de código para poder ver qué está sucediendo. -

1 Respuestas

MethodInvoker es solo un delegado predefinido que no toma parámetros y devuelve void:

public delegate void MethodInvoker()

Eres perfectamente libre de crear tu propio delegado en su lugar, al igual que en el ejemplo al que te vinculaste:

private delegate void MyDelegate();

y reemplazar MethodInvoker con MyDelegate.

En su código, un método anónimo es creado. La ventaja del método anónimo es que puede acceder a variables locales declaradas en myTimer_Elapsed. Desde elapsedTime y elapsedCounter parecen estar declarados fuera, puede reemplazar esto con un método definido explícitamente de la siguiente manera:

private void MyMethod() {
    this.lblElapsedTime.Text = elapsedTime.ToString();       

    if (elapsedCounter % 2 == 0)       
        this.lblValue.Text = EvenText;       
    else       
        this.lblValue.Text = OddText;       
}

private void myTimer_Elapsed(Object myObject,EventArgs myEventArgs){       
    ...

    if (elapsedTime.TotalMilliseconds < MaxTime)       
    {
        MyDelegate delegateToMyMethod = MyMethod;
        this.BeginInvoke(delegateToMyMethod);       
    }       
    else        
    {       
        ...
    }       
}        

contestado el 03 de mayo de 12 a las 09:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.