我试图制作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
答案 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();
}