C#创建函数队列

我写了一个名为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 function) { functionsQueue.Enqueue(function); } 

当我创建这个类的实例并调用Add方法时,它适用于没有参数的函数,例如:functionQueue.Add(Method); ,但是在调用具有参数和返回值的方法时(在我的情况下,ClassType作为参数,并且Boolean作为返回值),例如functionQueue.Add(Method2(classObject)); 它不编译,我错过了什么?

因为使用functionQueue.Add(Method2(classObject))您可以对调用的结果进行排队,而不是调用本身。

要使用参数排队方法,您应该将Add prototype更改为接受参数(并将它们与委托一起存储)。 作为替代方案,您可以使用lambdas:

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

(那么你的Add的第二次重载是没用的,你总是可以在一个Action中排队,你可以在闭包内给出所有参数)。

更新
这种类型的队列的一个例子是WinForms内部,从主线程以外的其他线程调度方法是通过方法队列完成的 (查看Control.MarshaledInvoke的反汇编)。 跳过同步和上下文它保留了System.Collections.Queue ,其中每个条目都是ThreadMethodEntry (用于保存所需数据的结构)。