在 C# 中使用队列?

Using Queue in C#?

好的,所以我正在开发一个控制台应用程序,它每 3 秒从 API 中提取一次。 API returns 一个 "Messages" 的列表,我需要将其添加到队列中,并在后台不断检查队列中的新项目,遍历项目,做物品的东西。

这是我目前的情况: 主程序方法

static void Main(string[] args)
{
    ConsoleKeyInfo answer = Console.ReadKey(true);
    if (answer.Key == ConsoleKey.Y)
    {
        while (true)
        {
            foreach (MessageObject message in messageQueue)
            {
                SendCommand(message.Message);

                // Debug
                Console.WriteLine(message.Message);
                messageQueue.Dequeue();
            }
        }
    }
    else
    {
        Environment.Exit(0);
    }
}

CheckChat 方法

static private async void CheckChat()
{
    Chat chat = await ChatAPI.GetChat(428);

    foreach (MessageObject chatMessage in chat.Messages)
    {
        messageQueue.Enqueue(chatMessage);
    }
}

但是,我收到以下错误:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.dll

Additional information: Collection was modified after the enumerator was instantiated.

我知道我在循环队列时将项目添加到列表中,但是我如何在添加对象时在后台连续检查队列中的项目?

如果您想在修改队列时对其进行枚举,则需要创建队列的副本,例如您可以:

foreach (MessageObject message in messageQueue.ToList())

请注意,您的队列很可能也应该是 ConcurrentQueue,因为您正在跨线程执行操作。

您可以使用(例如)while 循环而不是 foreach:

while (messageQueue.Count != 0)
{
    MessageObject message = messageQueue.Dequeue();
    Console.WriteLine(message.Message);
}

这种情况下修改一个队列是没有问题的。