在 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);
}
这种情况下修改一个队列是没有问题的。
好的,所以我正在开发一个控制台应用程序,它每 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);
}
这种情况下修改一个队列是没有问题的。