2015-01-21 3 views
1

У меня есть приложение, которое примерно через час использования начинает замедляться. В течение прошлой недели я проверил наличие утечек памяти и других подобных «временных оснований».Ухудшается ли производительность TextBox.Clear() со временем?

Я, наконец, подключил новую трассировку TimeLine, которая является профилировщиком dotTrace. Это показало мне, что большую часть времени было в методе TextBox.Clear() (около 3 секунд моей общей 5-секундной задержки).

Я прочитал и нашел это post, говоря, что TextBox.Clear() в 42 раза медленнее, чем значение TextBox для пустой строки.

Но это не отвечает, почему мое приложение только замедляется после часа использования.

Я посмотрел на метод TextBox.Clear(), и, похоже, он обрабатывает содержимое больше как окно редактирования (с разделами текста).

Могут ли повторные вызовы Clear создавать растущий список объектов в текстовом поле?

Или у кого-нибудь еще есть идея, почему это замедлится в течение часа повторных звонков до TextBox.Clear()?

UPDATE:
Я только что нашел этот post, что, кажется, указывает, что текстовое поле имеет стек отката, который не имеет предела. Возможно, мои вызовы для очистки делают добавление значений к этому стеку медленнее с течением времени.

UPDATE 2:
я сделать небольшой тест приложение, которое будет очистить текстовое поле 1500 раз при нажатии кнопки. Я нажал его примерно 30 раз. Около 70% из них заняло около 45 мс. Но остальные 30% потребовали 1,8 и 5,4 SECONDS!

Я понятия не имею, почему у него будет такой драматический сдвиг во времени. Тем не менее, мое приложение может иметь 2000 ясных вызовов в течение всего часа, так что это не похоже, что это доказательство того, почему Profiler говорит, что проблема TextBox.Clear().

+0

Этот стек для всех элементов управления или каждого элемента управления имеет свой собственный стек? – SharpCode

+0

Так вы попробовали сыграть с лимитом отмены на этом контроле? –

+1

@SharpCode - Есть два стека, каждый из которых выполняет итерацию через 3 элемента управления. Поэтому каждый элемент управления очищается дважды. – Vaccano

ответ

0

Я знаю, почему, конечно, но сменив на TextBox.Text = String.Empty;, я исправил свои проблемы с производительностью.

Я вернулся в свою ветку выпуска и изменил ТОЛЬКО это, и теперь мое приложение работает часами без замедлений.

ПРИМЕЧАНИЕ: Я не думаю, что это был стек Отменить. Я проверил значение по умолчанию, которое было у моего приложения (работает под .NET 4.5), и было ограничено до 100 (или 10, я не могу вспомнить). В любом случае, компьютеры, которые шли медленно, не показывали никакого давления памяти.

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

Смежные вопросы