0

我试图制作一个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
4

1 回答 1

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();
}
于 2013-11-11T22:57:59.293 回答