У меня есть задача, которая помещает журналы android logcat в сетку данных WPF. Проблема возникает при запуске приложения, огромные журналы (~ 80 000 строк журнала) должны быть загружены в сетку данных. Итак, у меня есть 2 решения для этой проблемы:
- Во-первых, если я использую ObservableCollection в качестве ItemSource, сетка данных будет обновляться построчно. Загрузка занимает ~ 10 000 строк => слишком медленно ... Не использовать IsAsyn c
- Затем я использую List в качестве ItemSource и устанавливаю IsAsyn c в правда. Я связываю данные программно каждую добавленную строку (или каждые 100,1000 добавленных строк). Для загрузки ~ 90.000 строк требуется всего 20 секунд. Но сетка данных обновляет (перезапускает) каждый вызываемый notifyChange, поэтому я ничего не могу сделать в сетке данных. Используйте IsAsyn c
Если у вас есть какое-либо решение для решения этой проблемы или просто решение для предотвращения обновления сетки данных, пожалуйста, помогите мне. Большое спасибо ~
Просмотр:
<DataGrid AutoGenerateColumns="False"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" ItemsSource="{Binding LogItemVMs,UpdateSourceTrigger=PropertyChanged,Mode=OneWay,IsAsync=True}"
EnableColumnVirtualization="True" EnableRowVirtualization ="True" VirtualizingStackPanel.IsVirtualizing ="True" VirtualizingStackPanel.VirtualizationMode="Recycling"
VirtualizingPanel.ScrollUnit="Pixel"
GridLinesVisibility="None">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Line" Width="auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Line,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
ViewModel
public List<LogItemVM> LogItemVMs { get; set; }
private void executeCmd()
{
new Thread(() =>
{
Process cmd = _commandImpl.CreateProcess("adb logcat -v threadtime");
try
{
cmd.Start();
string line;
LogCount = 0;
while ((line = cmd.StandardOutput.ReadLine()) != null)
{
LogInfo lif = _logInfoManager.ParseLogInfos(line);
if (lif != null)
{
LogItemVM livm = new LogItemVM(lif);
System.Windows.Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() =>
{
LogItemVMs.Add(livm);
LogCount++;
//if ((int)livm.Line % 1000 == 0)
onChanged(this, "LogItemVMs");
onChanged(this, "LogCount");
}));
}
}
}
catch { }
finally
{
if (!cmd.HasExited)
cmd.Kill();
}
}).Start();
}