在C#中使用队列?

Hun*_*ell 4 .net c# queue console-application

好的,所以我正在开发一个控制台应用程序,每隔3秒从API中提取一次.API返回一个"消息"列表,我需要将其添加到队列中,并在后台持续检查队列中的新项目,循环遍历项目,对项目执行某些操作.

这是我到目前为止: 主程序方法

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

CheckChat方法

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

    foreach (MessageObject chatMessage in chat.Messages)
    {
        messageQueue.Enqueue(chatMessage);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

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

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

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

Ben*_*aum 6

如果要在修改时枚举它,则需要创建Queue的副本,例如,您可以:

foreach (MessageObject message in messageQueue.ToList())
Run Code Online (Sandbox Code Playgroud)

请注意,在所有情况下,您的队列也应该是一个,ConcurrentQueue因为您正在跨线程执行操作.

  • 就像回答的评论一样 - 没有把'Select(x => x)`操作作为`ToList()`总是创建一个新列表. (2认同)