Чтение из SerialPort и управления памятью - C # - PullRequest
1 голос
/ 09 октября 2009

Я работаю над программой, которая считывает данные с последовательного порта, затем анализирует, форматирует и отображает информацию соответствующим образом. Эту программу, однако, необходимо запускать более 12 часов, постоянно обрабатывая поток входящих данных. Я обнаружил, что, когда я некоторое время позволяю своему приложению работать, использование памяти увеличивается с линейной скоростью - не годится для 12-часового использования.

Я реализовал регистратор, который записывает необработанные входящие двоичные данные в файл - есть ли способ использовать эту идею для регулярной очистки кеш-памяти? То есть как я могу так часто записывать в файл журнала, чтобы данные не нужно было хранить в памяти?

Кроме того, есть ли другие аспекты приложения Windows Form, которые могли бы способствовать этому? Например. Я печатаю отформатированные строки в текстовое поле, которое в итоге отображает всю строку. Поскольку он выполняется так долго, он легко отображает сотни тысяч строк текста. Должен ли я записать это в файл и очистить текст? Или что-то еще?

Ответы [ 3 ]

2 голосов
/ 09 октября 2009

Очевидно, что если строка увеличивается со временем, использование памяти вашим приложением также будет расти со временем. Кроме того, текстовые поля WinForms могут иметь проблемы при работе с очень большими строками. Насколько велика строка?

Если вы действительно не хотите отображать всю строку на экране, вам обязательно следует периодически ее очищать (в зависимости от ожиданий ваших пользователей); это сэкономит память и, вероятно, улучшит производительность.

1 голос
/ 09 октября 2009

Обычно управление памятью в .NET полностью автоматическое. Вы должны быть осторожны при экстраполяции коротких наблюдений (минут) на 12-часовой период. И обратите внимание, что TaskManager не очень хороший инструмент для измерения использования памяти.

Запись входящих данных не должна значительно увеличить использование памяти. Но есть несколько вещей, которые вы должны избегать, и конкатенация со строкой снова и снова является одним из них. Ваш TextBox, вероятно, стоит намного дороже, чем вы думаете. Использование ListBox будет более эффективным. И проще.

0 голосов
/ 09 октября 2009

У меня есть несколько последовательных приложений, которые запускаются либо как приложение, либо как служба Windows. Они должны быть до 24 / 7-365. Лучший механизм, который я нашел, чтобы избежать этой же проблемы, является двойным.

1) Запишите информацию в файл журнала. Для службы это единственный способ получить информацию. Файл журнала не увеличивает использование памяти.

2) Для приложения запишите информацию в файл журнала и поместите ее в список. Я обычно ограничиваю список до 500 или 1000 записей. Новые элементы управления .net виртуализируют списки, что помогает, но вы также не сталкиваетесь с другими проблемами памяти, такими как конкатенация текстовых полей.

Вы можете отключить систему с помощью текстового поля, постоянно добавляя строку в течение нескольких часов, поскольку она не предназначена для такого рода злоупотреблений из коробки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...