gpt4 book ai didi

C# 创建函数队列

转载 作者:行者123 更新时间:2023-11-30 13:27:31 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com