Периодический вывод текста в форму Windows - проблемы со скоростью - PullRequest
1 голос
/ 04 июля 2011

У меня довольно интенсивное приложение, которое я только что преобразовал из консольного приложения в приложение Windows Form.Программа, по сути, проходит через несколько тысяч клиентов и создает счета на основе их поставок.Для каждой доставки и клиента информация будет выводиться в окно консоли - это означает, что выводится много информации!Старый процесс занимал до 20 минут, что было разумно, учитывая масштаб того, что он делал.Но мой менеджер и заказчик теперь хотят использовать его как форму Windows.

Я реализовал это, и для вывода информации я немного обманул и просто заменил все вызовы Console.WriteLine () в существующемкод для вызова моего метода, который добавляет указанный текст в TextBox в форме Windows.

У меня было 2 проблемы с этим:

1:Текстовое поле иногда «замораживается» и становится белым - но я предполагаю, что не могу использовать более 1 потока, потому что я буду периодически вызывать текстовое поле в другом потоке

2: более серьезно, 20Минутный процесс до сих пор занимает значительно больше времени - около 4-5 часов.Я уверен, что набор данных не был значительно увеличен, чтобы протестировать весь код, который мы возвращаем к старой позиции, и единственная проблема, о которой я могу подумать, это добавление в текстовое поле.Я буду тестировать без каких-либо записей в текстовые поля завтра, чтобы подтвердить это, но код не изменился каким-либо другим способом

Существуют ли другие, более простые способы вывода текста в форму Windows, несколько раз в секунду

Ответы [ 3 ]

5 голосов
/ 04 июля 2011

Лучше всего, если вы НЕ выводите все данные прямо в текстовое поле.

Вместо этого раскрутите второй поток для обработки.Время от времени (20 записей? 100?) Синхронизируйте этот поток с основным для обновления какого-либо индикатора выполнения.

Пусть поток записывает обычные текстовые обновления либо в базу данных, либо в текстовый файл.

По завершении загрузите этот текстовый файл и отобразите его пользователю.

Почти все дополнительное время уходит на то, чтобы основной поток приложения перерисовывал форму;это дорогой процесс.Когда это происходит, обработка в основном блокируется (тот же поток).Поскольку объем данных в текстовом поле растет, количество времени, которое он тратит на обновление, линейно увеличивается с каждым добавлением в текстовое поле ... Итак, 10 записей не заметят значительного влияния.1000+ будет .. в зависимости от того, сколько данных вы добавляете.

1 голос
/ 04 июля 2011

У вас есть пара проблем:

  1. Windows Forms имеет сходство потоков. Это означает, что все записи должны происходить в потоке пользовательского интерфейса. Если вы работаете с несколькими потоками, обязательно перенаправьте вызовы в основной поток с помощью Control.Invoke или Control.BeginInvoke.

  2. Добавление к строке в TextBox будет становиться все медленнее и медленнее по мере увеличения текста. Попробуйте уменьшить количество добавлений, которые вы делаете.

Лично я бы предложил попробовать следующее:

Используйте BackgroundWorker для запуска вашей операции. Вы можете поддерживать переменную textToAppend типа StringBuilder, которая позволяет добавлять текст. Через равные промежутки времени (т. Е., Возможно, в обработчике изменения изменений) добавьте весь блок текста к элементу управления TextBox (или RichTextBox). Скорее всего, вам потребуется синхронизировать доступ к построителю строк через блокировку или другой механизм, чтобы предотвратить возникновение состояния гонки.

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

1 голос
/ 04 июля 2011

I предложит использовать рабочий поток и сделать потокобезопасные обратные вызовы для обновления текстовой области.

Microsoft предоставляет пример этого здесь: http://msdn.microsoft.com/en-us/library/ms171728.aspx

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

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