C# création de la fonction de file d'attente

j'ai écrit une classe appelée 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);
    }

et quand je crée une instance de cette classe et que j'appelle la méthode Add, cela fonctionne très bien pour les fonctions sans arguments, par exemple: functionQueue.Add(Method); , mais en appelant sur des méthodes qui ont un argument et une valeur de retour(dans mon cas ClassType comme argument, et booléen comme valeur de retour), par exemple functionQueue.Ajouter(Method2(classObject)); il ne compile pas, ce qui me manque?

3
demandé sur Fazi 2012-05-23 13:43:15

1 réponses

parce qu'avec functionQueue.Add(Method2(classObject)) vous faites la queue pour le résultat de votre appel, pas pour l'appel lui-même.

pour consulter une méthode avec des paramètres, vous devez changer le prototype Add pour accepter les paramètres (et les stocker avec le délégué). Comme alternative, vous pouvez utiliser lambdas:

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

(alors votre deuxième surcharge de Add est inutile, vous pouvez toujours faire la file d'attente d'un Action où vous donnez tous les paramètres à l'intérieur de la fermeture).

mise à Jour

Un exemple d'une file d'attente de ce type est WinForms intérieur, l'expédition des méthodes à partir d'autres fils que le fil principal est fait avec un file d'attente de méthode (regardez le démontage de Control.MarshaledInvoke ). Sautant la synchronisation et les contextes, il conserve un System.Collections.Queue où chaque entrée est ThreadMethodEntry (une structure utilisée pour contenir les données nécessaires).

12
répondu Adriano Repetti 2012-05-23 12:01:28