Я провел очень простой тест производительности в клиентском приложении WPF:
public partial class MainWindow : Window
{
private ObservableCollection<int> data = new ObservableCollection<int>();
public ObservableCollection<int> DataObj { get { return data; } }
private void button1_Click(object sender, RoutedEventArgs e)
{
for (int j = 0; j < 5; j++)
{
Thread t = new Thread(() =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(5);
Dispatcher.Invoke(new Action(() => { data.Add(1); })); //updates the count
Dispatcher.Invoke(new Action(() => { richTextBox1.AppendText("1"); })); //updates the string data
}
});
t.Start();
}
}
Затем у меня есть два элемента управления в пользовательском интерфейсе: TextBlock
и RichTextBox
.
TextBlock
привязан к свойству Count
источника данных, в то время как RichTextBox
добавляет каждое новое значение данных в свою текстовую строку (т. Е. Отображает содержание данных).
Если я отключу привязку RichTextBox
, TextBlock
обновляется очень быстро, циклически меняя счетчик. Однако включение привязки RichTextBox
замедляет все , оба элемента управления обновляются в «глобусах», возможно, один или два раза в секунду. Другими словами, весь пользовательский интерфейс работает в темпе привязки RichTextBox
.
Есть ли способ избавиться от этой зависимости производительности? Я понимаю, что RichTextBox вполне может быть медленным, но почему он должен замедлять быстрый TextBlock, который в противном случае был бы быстрым?