Lifeupdate DataGrid из TextFile с хорошей производительностью

Актуальное состояние:

у меня естьDataGrid с 4 столбцами (Icon | DateTime | LogLevel | Message)

Я использую это как средство просмотра, чтобы представить записиLogFile, При открытииWindow лаги интерфейса и множество записей добавляются одна за другой кDataGrid.

Замечания: Я уже использую несколько потоков. Мой UI-Thread не зависает. Это просто займет много времени, чтобы заполнить весьDataGrid.

Что я хочу:

Я бы предпочел что-то вроде «предварительного рендеринга» всего окна, прежде чем показывать его пользователю.

Когда у меня аради открылиWindow один раз - каждый раз, когда я открываю его снова, это больше не проблема. (не рендеринг нового ....?)

Что я пробовал:

НастройкаVisibility вHidden и ждать(Thread.Sleep()) 10 секунд затем установитеVisibility = Visibility.Visible;Добавление всех данных в мойDataGrid во ViewModel-Конструкторе

но все это не помогло. Я даже не уверен, что это код C # или только привязки ...

Это может быть глупым вопросом, но есть ли способ «предварительно визуализировать»DataGrid И егоContent перед отображением?

РЕДАКТИРОВАТЬ:

Я также использую некоторыеDataTriggers установить RowColor, но это не может быть проблемой ..

Вот код, который я использую:

Начальный класс:

 public class LogEntry
{
    public string LogLevel { get; set; }
    public string LogLevelIcon
    {
        get
        {
            switch(LogLevel)
            {
                case "[D]":     //IF DEBUG ENTRY:
                    return "pack://application:,,,/Resources/Bug.png";
                case "[F]":     //IF FATAL ENTRY
                    return "pack://application:,,,/Resources/System-error-alt.png";
                case "[E]":     //IF ERROR ENTRY
                    return "pack://application:,,,/Resources/Error_32_WhiteBackground.png";
                case "[I]":     //IF INFO ENTRY
                    return "pack://application:,,,/Resources/Info_32.png";
                case "[W]":     //IF WARNING ENTRY
                    return "pack://application:,,,/Resources/Warning_32_WhiteBackground.png";
                case "[DB]":    //IF DB ENTRY
                    return "pack://application:,,,/Resources/Database.png";
                default:
                    return string.Empty;
            }                
        }
    }
    public string Message { get; set; }
    public DateTime DateTime { get; set; }

    public override string ToString()
    {
        return $"{LogLevel};{DateTime.ToString("dd.MM.yyyy HH:mm:ss")};{Message}";
    }
}

Получение данных из моего LogFile:

public void ExtractDataFromLogFile(string logFilePath)
    {
        new Thread(() => {

            List<string> linesInFile = new List<string>();
            using (FileStream stream = File.Open(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (StreamReader reader = new StreamReader(stream))
                {
                    while (true)
                    {
                        while (!reader.EndOfStream)
                        {
                            ProcessFileContent(reader.ReadLine());
                        }
                        while (reader.EndOfStream)
                        {
                            Thread.Sleep(50);
                        }
                    }
                }
            }

        }).Start();
    }

Добавление кObservableCollection<LogEntry>() _logEntries;:

private void ProcessFileContent(string line)
    {
        Match match = _regex.Match(line);
        if (match.Success)
        {
            LogEntry entry = new LogEntry()
            {
                LogLevel = match.Groups[1].ToString(),
                DateTime = DateTime.Parse(match.Groups[2].ToString(), new CultureInfo("de-DE")),
                Message = match.Groups[3].ToString()
            };                    
            _logEntries.Add(entry);                    
        }
    }

Наконец, XAML DataGrid (стили исключены!):

<DataGrid Grid.Row="1"
          x:Name="DataGrid"
          Grid.ColumnSpan="2"
          Margin="5"
          IsReadOnly="True"
          AutoGenerateColumns="False"
          CanUserReorderColumns="False"
          ItemsSource="{Binding Path=ItemsView, UpdateSourceTrigger=PropertyChanged}">
  <DataGrid.Columns>
            <DataGridTemplateColumn Width="Auto">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Path=LogLevelIcon, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                               Width="16" 
                               Height="16"></Image>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Width="Auto" Header="Datum"
                                Binding="{Binding Path=DateTime, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>               
            <DataGridTextColumn Width="*" Header="Meldung"
                                Binding="{Binding Path=Message, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataGrid.Columns>
    </DataGrid>

Обратите внимание, что "ItemsView" является typeofICollectionView

Я заполняю это здесь:

private void InitializeCollection()
    {
        ItemsView = CollectionViewSource.GetDefaultView(_logEntries);
        BindingOperations.EnableCollectionSynchronization(_logEntries, _lock);
    }

Ответы на вопрос(1)

Ваш ответ на вопрос