Ответ 1
Специфика WPF заключается в том, что в окне есть только один поток пользовательского интерфейса.
Хотя можно использовать другое окно и заставить его выглядеть так, как будто он является частью текущего приложения (установите для свойства WindowStyle значение None и обновите позицию и размер), это выглядит неестественно, и есть лучший способ устраняйте проблемы с производительностью.
Как известно, для обновления пользовательского интерфейса из фонового потока необходимо использовать класс Dispatcher
. Метод BeginInvoke
имеет необязательный параметр типа DispatcherPriority, который имеет следующие значения.
- SystemIdle
- ApplicationIdle
- ContextIdle
- Фон
- Ввод
- Loaded
- Render
- DataBind
- Normal
- Отправить
Значение по умолчанию Normal (9)
, это почти самый высокий приоритет и применяется неявно, когда вы вызываете метод BeginInvoke
без параметров. Вызов RichTextBox
в вашем примере имеет этот приоритет.
Но ваш TextBlock
, связанный с этим свойством и не обновляемый вручную, имеет более низкий приоритет DataBind (8)
, поэтому он обновляется медленнее.
Чтобы сделать привязку быстрее, вы можете уменьшить приоритет вызова до RichTextBox
и установить значение ниже 8, например Render (7)
.
Dispatcher.Invoke(/*...*/, DispatcherPriority.Render);
Это поможет с привязкой, но пользовательский интерфейс не будет реагировать на щелчки мыши, вы не сможете даже закрыть окно.
Продолжайте уменьшать приоритет:
Dispatcher.Invoke(/*...*/, DispatcherPriority.Input);
Приложение реагирует лучше, но по-прежнему невозможно ввести что-то в RichTextBox
, пока оно заполнено текстом.
Поэтому конечное значение Background (4)
:
Dispatcher.Invoke(new Action(() => { richTextBox1.AppendText("1"); }),
DispatcherPriority.Background);