带有参数的委托队列
本文关键字:队列 参数 | 更新日期: 2023-09-27 18:05:39
这个问题对我来说有点复杂,我不是c#专家。
基本上我有一个我想处理的任务队列。我希望能够把各种功能推到那个Queue,它们会做不同的事情,但都会把一个字符串作为参数。问题是:如何使用委托来实现这一点?我不知道如何做到这一点,使编译器不会抛出任何错误。
代码或多或少地说明了我想要做的事情:
delegate void Del(string);
Queue<Del> Q = new Queue<Del>();
public DT()
{
string foo = "bar";
Q.Enqueue((foo) =>
{
//do some stuff
});
}
//somewhere else I constantly check the queue and run the tasks
这个设计可能看起来很奇怪,但在这方面我很确定我在做什么。
因此,这会给出一个编译器错误,即不能声明局部变量foo。当然我不想声明它,我想把它传递给被推入队列的函数。我该怎么办?
我希望你能理解我的问题。谢谢你。只是使用不同的lambda参数名称(目前它与本地foo
变量声明冲突):
Q.Enqueue(f => {
//do some stuff
});
然后你可以从队列中获得委托并传递参数给它:
Q.Dequeue()(foo);
如果您想捕获foo
变量的值,那么只需在做一些事情部分使用它。在这种情况下,您可能需要带有签名的委托,它不接受任何输入参数:
Queue<Action> actions = new Queue<Action>();
string foo = "bar";
actions.Enqueue(() => Console.WriteLine(foo));
actions.Dequeue()();
BTW:您不需要创建这些委托-使用现有的Action<T>
或Action
委托。
委托类型形成最终调用的签名。因为您已经说过字符串是在您排队时提供的,所以调用的签名是
delegate void Del();
Queue<Del> Q = new Queue<Del>();
现在开始排队:
public DT()
{
string foo = "bar";
Q.Enqueue(() =>
{
//do some stuff using foo
});
}
foo
的值在lambda的作用域中,并且在进入队列之前将被捕获到委托中。这被称为闭包。
请注意,您可以使用预定义的委托类型System.Action
,而不是创建自己的。