Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810

Почему TextBox может тормозить?

29.08.2022, 13:19. Показов 2375. Ответов 21

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня есть процесс, значения которого (double) отображаются в интерфейсе.
Интерфейс содержит TextBox-ы (порядка 20 штук), значения которых обновляются каждые 50 мс по таймеру.
Проблема в том, что при интенсивном их изменении (и возможно если я взаимодействую с другими элементами интерфейса) изменение свойства Text в TextBox-е начинает занимать много времени.
Обычно TextBox обновляется за микросекунды, по иногда случайно регулярно он обновляется за 5 милисекунд.
Наличие нескольких текстбоксов в интерфейсе дает случайные фризы в обновлении интерфейса
(ну то есть если замерять быстродействие всего метода UiTimerOnTick - то будет
0.3 , 0.3 , 0.3, 0.3, 20, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 20, 0.3, 0.3 , 0.3, 20 .. )

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//упрощенно
private void UiTimerOnTick(object sender, EventArgs eventArgs)
{
      foreach(NumericValueSimple  textBox in TextBoxes)
      {
             textBox.Value = someValue;
      }
}
 
public partial class NumericValueSimple : TextBox{
        private double _value;
        public double Value {
            get => _value;
            set
            {
                if (Math.Abs(value - _value) < 1e-9) return;
                if (!_editMode) {
                    var sw = System.Diagnostics.Stopwatch.StartNew();
                    Text = value.ToString(NumFormat);
                    sw.Stop();
                    //И да, он достаточно регулярно сюда падает
                    if (sw.ElapsedMilliseconds > 3)
                    {
                        System.Diagnostics.Debug.WriteLine($"Time = {sw.Elapsed.TotalMilliseconds}");
                    }
                }
                _value = value; 
            }
        }
}
Я убрал отсюда все Binding-и и события типа TextChanged, но лаги так и остались.
Почему TextBox иногда так тормозит при изменении ее текста?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2022, 13:19
Ответы с готовыми решениями:

Почему TextBox не может получить фокус ввода?
Здравствуйте. Есть UserControl - DateTimePicker у него есть Popup-окно с календарём и TextBox'ом для ввода времени. В примере...

Может ли использование триггеров тормозить сервер Oracle?
Может ли использование триггеров тормозить сервер Oracle?

Почему программа C++ может тормозить?
Здравствуйте, не подскажите возможные причины торможения программы C++?

21
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16159 / 11279 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
30.08.2022, 13:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от jetyb Посмотреть сообщение
Там среда не позволит вызывать методы WPF из другого потока.
Все UI элементы (и Формы тоже) работают только в основном потоке приложения.
Поэтому я и написал:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А для асинхронного обновления значений нужно использовать привязки - иначе будут выкидываться исключения.
Цитата Сообщение от jetyb Посмотреть сообщение
Я кстати слабо представляю как можно измерить быстродействие Binding и найти тормозящее место.
Вам не нужно измерять Binding, так как он не имеет отношения к Бизнес Логике.
Вам нужно измерять время обновления свойств VM.
Что-то в таком духе:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using Simplified;
using System.Diagnostics;
using System.Linq;
using System.Threading;
 
namespace Core2022.jetyb
{
    public class TestViewModel : BaseInpc
    {
        private int _progress;
        private double _maxRefresh;
 
        public int Progress { get => _progress; set => Set(ref _progress, value); }
        public double MaxRefresh { get => _maxRefresh; set =>Set(ref _maxRefresh, value); }
 
        public Data[] Datas { get; }
            = Enumerable.Range(1, 50)
                        .Select(i => new Data() { Value = i })
                        .ToArray();
 
        private readonly Timer timer;
 
        public TestViewModel()
        {
            timer = new Timer(OnTick, null, 1000, 50);
        }
 
        private readonly Stopwatch sw = Stopwatch.StartNew();
        private void OnTick(object? state)
        {
            sw.Restart();
            Progress++;
            for (var i = 0; i < Datas.Length; i++)
            {
                Datas[i].Value += Progress + i;
            }
            sw.Stop();
            if (sw.Elapsed.TotalMilliseconds > MaxRefresh)
                MaxRefresh = sw.Elapsed.TotalMilliseconds;
 
            if (sw.ElapsedMilliseconds > 3)
            {
                Debug.WriteLine($"Time = {sw.Elapsed.TotalMilliseconds}");
            }
        }
    }
    public class Data : BaseInpc
    {
        private double _value;
        public double Value
        {
            get => _value;
            set => Set(ref _value, value);
        }
    }
 
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<Window x:Class="Core2022.jetyb.WpfApp6MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Core2022.jetyb"
        xmlns:ccs="clr-namespace:WpfCustomControlsCore;assembly=WpfCustomControlsCore"
        mc:Ignorable="d"
        Title="WpfApp6MainWindow" Height="450" Width="800"
        DataContext="{DynamicResource vm}">
    <FrameworkElement.Resources>
        <local:TestViewModel x:Key="vm"/>
    </FrameworkElement.Resources>
    <StackPanel Orientation="Vertical" >
        <TextBlock Text="{Binding Progress}"/>
        <Slider x:Name="Slider" Value="{Binding Progress}" Maximum="10000"/>
        <TextBlock Text="{Binding MaxRefresh}"/>
        <ListBox x:Name="ListBox" ItemsSource="{Binding Datas}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <ccs:EditableTextBox Text="{Binding Value}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</Window>
1
30.08.2022, 14:38

Не по теме:


Если кратко: проблема решена, или всё ещё нет?
Потому что вижу, что отмечено решение, но не вижу причину фриза в ней

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2022, 14:38

Почему убунту на виртуальной машине может тормозить?
установил убунту на виртуальную машину и на виртуалке тормозит? в чем может быть причина

Из-за чего может тормозить компьютер?
Компьютер почистила от пыли, температура процессора 47-52 градусов, на вирусы проверила, к тому же только переустановила ОС (переустановила...

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

Может ли игра тормозить из-за кривого кряка?
может ли игра подтормаживать из за какого нибудь &quot;кривого&quot; noCD???? или из за установки мода?

Может ли компьютер тормозить от недостатка мощности БП ?
У меня вопрос... недавно у меня накрылся кое чем бп... он был на 400 ватт... комп был оч нужен и поэтому я фставил старый,на 300 ватт... и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru