Проблема в том, что, пока вы перебираете IEnumerable
, используя foreach
, коллекция изменяется в другом потоке.
Вам нужна коллекция, которую вы можете одновременно добавлять ичитать из.
В верхней части файла добавить
using System.Collections.Concurrent;
Изменить это:
private List<string> bufferStrings = new List<string>();
на
private ConcurrentQueue<string> bufferStrings = new ConcurrentQueue<string>();
Изменить
bufferStrings.Add(((SerialPort)sender).ReadLine());
до
bufferStrings.Enqueue(((SerialPort)sender).ReadLine());
Затем вы можете читать из очереди, не беспокоясь о том, что что-то еще записывает в нее:
private void PopQueue(object sender, EventArgs e)
{
while (bufferStrings.TryDequeue(out string dequeued))
AppendText(dequeued);
}
Это просто продолжает пытатьсявыносите предметы из очереди, пока их больше нет.TryDequeue
возвращает false, когда очередь пуста.Если вы продолжите добавлять элементы во время работы этого метода, он просто продолжит их обрабатывать.
ConcurrentQueue