C# WPF文本框性能

C# WPF文本框性能,c#,wpf,multithreading,xaml,mvvm,C#,Wpf,Multithreading,Xaml,Mvvm,我正在开发一个在单独线程中检索数据的应用程序。在线程内“调用”委托以获取viewmodel中的数据。字符串属性将用于设置WPF文本框的文本(数据绑定) 视图模型 private string _resultText; public string ResultText { get { return _resultText; } set { _resultText = value; RaisePropertyCh

我正在开发一个在单独线程中检索数据的应用程序。在线程内“调用”委托以获取viewmodel中的数据。字符串属性将用于设置WPF文本框的文本(数据绑定)

视图模型

private string _resultText;
public string ResultText
{
    get
    {
        return _resultText;
    }
    set
    {
        _resultText = value;
        RaisePropertyChanged();
    }
}
XAML

<TextBox Name="tbxResult" Text="{Binding ResultText, Mode=TwoWay}" TextWrapping="NoWrap" Padding="10,10,10,10" IsReadOnly="True"/>

线程正在检索大量数据,这会导致性能问题。UI被冻结,直到检索到所有数据。我已经尝试使用Binding IsAsync=“True”属性TextWrapping=“NoWrap”,调用ResultText的setter中的Dispatcher.Invoke并检查问题

提供的任何解决方案都不能提高性能

执行以下代码会导致相同的(性能)问题:

private void btnRetrieveResultData\u单击(对象发送方,路由目标)
{
对于(int i=0;i<3000;i++)
{
tbxResult.Dispatcher.Invoke(()=>
{
tbxResult.AppendText(“testMessage”+i);
});
}
}

处理大量数据并将其显示在文本框中的解决方案/实现是什么?(它可能是另一个提供滚动和选择文本选项的控件)。

我不确定是否理解您的问题,但我将使用“执行以下代码导致相同(性能)问题”,将
I
更改为300.000,以向textbox添加更多文本。将其更改为:

   private void ButtonClicked(object sender, RoutedEventArgs e) {
        Task.Run(() =>
        {
            for (int i = 0; i < 300000; i++) {
                tbxResult.Dispatcher.Invoke(() => {
                    tbxResult.AppendText("testMessage" + i + "\r\n");
                }, DispatcherPriority.Background);
            }
        });
    }
private void按钮勾选(对象发送方,路由目标){
Task.Run(()=>
{
对于(int i=0;i<300000;i++){
tbxResult.Dispatcher.Invoke(()=>{
tbxResult.AppendText(“testMessage”+i+“\r\n”);
},DispatcherPriority.Background);
}
});
}

以非常流畅的方式将行添加到textbox,而不冻结任何UI,您可以在添加项目时手动滚动textbox。

如果您将textbox的属性设置为IsReadOnly=“True”,则我建议您使用TextBlock而不是使用textbox,因为,
Textbox使用30个元素作为控件,而textblock仅使用1个元素。

您是否真的希望Textbox实时更新(如中所示,以便用户在发生更改时看到更改)?我更喜欢实时,但稍微延迟也不错。(例如,如果我显示一个进度百分比,它是否从0%跳到15%无关紧要)。如果没有更好的解决方案,您可以在字符串更改出现时缓存它们,并根据需要随时更新文本框。因此,当你的线程带来变化时,更新一个字符串而不是textbox使用的属性。我说的“只要你愿意”,是指使用计时器或类似的东西,每秒触发N个textbox更新,其中更新是
textBoxText=cachedText
那么您是在向textbox添加大量文本还是用高频替换它?使用textbox的优点是可以选择和复制文本。在某些情况下,如显示调试信息、只读数据库内容,textbox是一个更好的选项。是的,我理解,但我建议在性能方面使用相同的选项。当然,选择控制取决于需求。
   private void ButtonClicked(object sender, RoutedEventArgs e) {
        Task.Run(() =>
        {
            for (int i = 0; i < 300000; i++) {
                tbxResult.Dispatcher.Invoke(() => {
                    tbxResult.AppendText("testMessage" + i + "\r\n");
                }, DispatcherPriority.Background);
            }
        });
    }