He escrito una clase llamada QueueManager:

class QueueManager
{
    Queue functionsQueue;

    public bool IsEmpty 
    { 
        get 
            {
                if (functionsQueue.Count == 0)
                    return true;
                else
                    return false;
            }
    }

    public QueueManager()
    {
        functionsQueue = new Queue();
    }

    public bool Contains(Action action)
    {
        if (functionsQueue.Contains(action))
            return true;
        else 
            return false;
    }

    public Action Pop()
    {
        return functionsQueue.Dequeue() as Action;
    }

    public void Add(Action function)
    {
        functionsQueue.Enqueue(function);
    }

    public void Add(Func<CacheObject,Boolean> function)
    {
        functionsQueue.Enqueue(function);
    }

Y cuando creo una instancia de esta clase y llamo al método Add, funciona bien para funciones sin argumentos, por ejemplo: functionQueue.Add (Method); , pero al llamar a métodos que tienen un argumento y un valor de retorno (en mi caso, ClassType como argumento y booleano como valor de retorno), por ejemplo functionQueue.Add (Method2 (classObject)); no se compila, ¿qué me falta?

4
Fazi 23 may. 2012 a las 13:43
2
 – 
CodeCaster
23 may. 2012 a las 13:44

1 respuesta

La mejor respuesta

Porque con functionQueue.Add(Method2(classObject)) pone en cola el resultado de su llamada, no la llamada en sí.

Para poner en cola un método con parámetros, debe cambiar el prototipo Add para aceptar parámetros (y almacenarlos junto con el delegado). Como alternativa, puede utilizar lambdas:

functionQueue.Add(() => Method2(classObject));

(entonces su segunda sobrecarga de Add es inútil, siempre puede poner en cola un Action donde le da todos los parámetros dentro del cierre).

Actualizar
Un ejemplo de una cola de este tipo está dentro de WinForms, el envío de métodos desde otros subprocesos distintos del subproceso principal se realiza con una cola de métodos (mire el desmontaje de Control.MarshaledInvoke). Omitiendo la sincronización y los contextos, mantiene un System.Collections.Queue donde cada entrada es ThreadMethodEntry (una estructura utilizada para contener los datos necesarios).

13
Adriano Repetti 23 may. 2012 a las 16:01
3
Wow ... eso realmente tiene sentido ... aaa y funciona: D .. gracias: D
 – 
Fazi
23 may. 2012 a las 13:54