C# 创建函数队列

标签 c# .net queue action func

我编写了一个名为 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);
    }

当我创建此类的实例并调用 Add 方法时,它对于没有参数的函数工作正常,例如: functionQueue.Add(方法); ,但是当调用具有参数和返回值的方法时(在我的例子中,ClassType 作为参数,Boolean 作为返回值),例如 functionQueue.Add(Method2(classObject));它不编译,我错过了什么?

最佳答案

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

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

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

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

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

关于C# 创建函数队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10717344/

相关文章:

c# - Umbraco 6 - 读取中央配置设置的 "correct"方式是什么?

.net - 如何在 .NET 中安全地运行异步代码和事件以便 VB6 可以处理它?

c# - C# linq 支持 "anti join"语义吗?

c# - .net 4.0 安全模型。另一个 "Inheritance security rules violated by type..."异常

.net - 错误 - 安装了不兼容的 DacFx 版本

c# - 是否有 C# 等效于 Java 的 BlockingQueue.drainTo(Collection) 方法?

c++ - 使用 For 循环对队列进行入队和出队 - C++

multithreading - 多线程批处理队列。怎么办?

c# - 从 TPL 任务向 WPF View 报告进度的适当方法是什么?

c# - 每个参数 "pattern"的分配和评估是否有名称?