带有参数的委托队列

本文关键字:队列 参数 | 更新日期: 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,而不是创建自己的。