Odr*_*rai 2 c# wpf xaml multithreading mvvm
我正在开发一个在单独线程中检索数据的应用程序。在线程内“调用”委托以获取视图模型中的数据。字符串属性将用于设置 WPF TextBox 的文本(数据绑定)。
视图模型
private string _resultText;
public string ResultText
{
get
{
return _resultText;
}
set
{
_resultText = value;
RaisePropertyChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
XAML
<TextBox Name="tbxResult" Text="{Binding ResultText, Mode=TwoWay}" TextWrapping="NoWrap" Padding="10,10,10,10" IsReadOnly="True"/>
Run Code Online (Sandbox Code Playgroud)
该线程正在检索大量数据,这会导致性能问题。UI 将被冻结,直到检索到所有数据。我已经尝试使用 Binding IsAsync="True" 属性、 TextWrapping="NoWrap",在 ResultText 的设置器中调用 Dispatcher.Invoke 并检查问题'slow-wpf-textbox'。
所提供的解决方案都无法提高性能。
执行以下代码会导致相同的(性能)问题:
private void btnRetrieveResultData_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 3000; i++)
{
tbxResult.Dispatcher.Invoke(() =>
{
tbxResult.AppendText("testMessage" + i);
});
}
}
Run Code Online (Sandbox Code Playgroud)
处理大量数据并将其显示在文本框中的解决方案/实现是什么?(它可能是另一个提供滚动和选择文本选项的控件)。
我不确定我是否理解您的问题,但我将使用“执行以下代码会导致相同的(性能)问题”,更改i
为 300.000 以向文本框添加更多文本。将其更改为:
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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
以非常流畅的方式向文本框添加行,没有任何 UI 冻结,并且您实际上可以在添加项目时手动滚动文本框。
归档时间: |
|
查看次数: |
3081 次 |
最近记录: |