1. Baza danych wysyła wynik operacji pobierania danych (LogService_LogsReadingProgressChanged)
  2. Otrzymuję dzięki temu:
LogsDataBox[] DataBoxes
  1. Każdy LogsDataBox muszę przekonwertować do LogViewerItemProperty za pomocą FillList()
  2. Metoda konwertująca wysyła event Step_List_LoadingProgressChanged który dodaje skonwertowany obiekt do
private IList<LogViewerItemProperty> logList = new ObservableCollection<LogViewerItemProperty>();
        public IList<LogViewerItemProperty> LogList
        {
            get
            {
                return logList;
            }
            set
            {
                logList = value;
                OnPropertyChanged("LogList");
            }
        }

Podczas dodawania otrzymuję:
„Ten typ CollectionView nie obsługuje zmian własnej kolekcji SourceCollection z wątku innego niż Dispatcher.”

macie jakąś poradę jak dodać do listy 100 elementów bez zatrzymania wątku głównego? Próbowałem wygenerować listę asynchronicznie i przekazać gotową Listę jako parametr w LoadingEnd, a następnie LogList=newList, niestety to również blokuje mi wątek główny.

private void LogService_LogsReadingProgressChanged(object sender, LogsEvents.LogsReadedEventArgs e)
        {   
            switch(e.Progress)
            {
                case GeneralEnums.eProgress.Start:
                    break;
                case GeneralEnums.eProgress.End:
                    switch(e.Result)
                    {
                        case GeneralEnums.eResult.ErrorConnecting:
                            LoadingEnd?.Invoke(this, new ResultInfo(eResult.Failed, new ErrorInfo(eOperationError.ErrorConnection, "Brak połączenia z internetem")));
                            break;
                        case GeneralEnums.eResult.Failed:
                            LoadingEnd?.Invoke(this, new ResultInfo(eResult.Failed, new ErrorInfo(eOperationError.UndefinedError, "Nie udało się pobrać zdarzeń")));
                            break;
                        case GeneralEnums.eResult.Success:
                            FillList(e.DataBoxes);
                            break;
                    }
                    break;
            }
        }
        private async void FillList(LogsDataBox[] DataBoxes)
        {
            await Task.Run(() => FillList(DataBoxes, LoadingEnd, LoadingProgressChanged));
        }
        private static void FillList(LogsDataBox[] DataBoxes, EventHandler<ResultInfo> LoadingEnd, EventHandler<ProgressInfoEventArgs> LoadingProgressChanged)
        {
            if(DataBoxes != null)
            {
                double max = DataBoxes.Count();
                for (int n = 0; n < DataBoxes.Count(); ++n)
                {
                    LoadingProgressChanged?.Invoke(null, new ProgressInfoEventArgs((n * 100) / max, new LogViewerItemProperty(DataBoxes[n])));
                }
                LoadingEnd?.Invoke(null, new ResultInfo(eResult.Success));
            }
            else
            {
                LoadingEnd?.Invoke(null, new ResultInfo(eResult.Failed, new ErrorInfo(eOperationError.UndefinedError, "Nie udało się pobrać zdarzeń")));
            }
            
        }

        public event EventHandler<EventArgs> LoadingStart;
        public event EventHandler<ResultInfo> LoadingEnd;
        public event EventHandler<ProgressInfoEventArgs> LoadingProgressChanged;

        private void Step_List_LoadingProgressChanged(object sender, ProgressInfoEventArgs e)
        {
            LoadingProgress = e.Procent;
            LogList.Add((LogViewerItemProperty)e.Data);
        }