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?
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).