Итак, я работаю над консольным приложением, которое извлекает из API каждые 3 секунды. API возвращает список «Сообщения», который мне нужно добавить в очередь, и что-то в фоновом режиме постоянно проверяет наличие новых элементов в очереди, перебирает элементы, делает что-то с элементами.Использование очереди в C#?
Вот то, что я до сих пор: Основная программа Метод
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.
Я понимаю, что я добавляю элементы в список во время цикла в очереди, но как я буду постоянно проверять элементы в очереди в качестве им добавления объектов?
это означает, что вы не можете ставить в очередь во время перечисления – Legends
@Legends Правильно, но если im всегда (каждые x секунд), необходимо добавить элементы в мою очередь из API, как бы я это сделал? –
Скорее всего, ваша асинхронность меняет содержимое messageQueue, пока вы заняты. Почему бы вам не попробовать и просто проверить размер (длину), а затем прочитать по одному. .... или, как сказал Бен, создать копию и прочитать ее. –