行动队列代表没有正确调用,为什么?

时间:2013-11-11 22:54:43

标签: c# .net-4.0 delegates action

我试图制作Queue<Action>。当我去出列并调用每个动作时,它一直停在4。我浏览了代码,它正在正确处理所有内容。我在这里做错了什么?

public class Program
{
    static void Main(string[] args)
    {
        SomeClass test = new SomeClass();
        test.EnqueuePrint("1");
        test.EnqueuePrint("2");
        test.EnqueuePrint("3");
        test.EnqueuePrint("4");
        test.EnqueuePrint("5");
        test.EnqueuePrint("6");
        test.EnqueuePrint("7");
        test.EnqueuePrint("8");
        Console.WriteLine("Process the queue!");
        test.ProcessQueue();
    }
}

public class SomeClass
{
    private Queue<Action> _actionQueue;

    public SomeClass()
    {
        _actionQueue = new Queue<Action>();
    }
    public void EnqueuePrint(string message)
    {
        _actionQueue.Enqueue(() => Print(message));
    }

    private void Print(string message)
    {
        Console.WriteLine(message);
    }

    public void ProcessQueue()
    {
        for (int i = 0; i < _actionQueue.Count; i++)
        {
            _actionQueue.Dequeue().Invoke();
        }
    }
}

输出

Process the queue!
1
2
3
4

1 个答案:

答案 0 :(得分:4)

问题是,当您将项目出列时,计数会减少。因此,当i为4时,计数 4,因此循环停止。

如果要在队列为空之前继续出列,可以使用:

while (_actionQueue.Count > 0)
{
    _actionQueue.Dequeue().Invoke();
}

或者,如果操作可能(在其他情况下)向队列添加更多项目,并且您只想处理与原始项目一样多的项目,则可以使用:

int originalCount = _actionQueue.Dequeue();
for (int i = 0; i < originalCount; i++)
{
    _actionQueue.Dequeue().Invoke();
}