- Baza danych wysyła wynik operacji pobierania danych (LogService_LogsReadingProgressChanged)
- Otrzymuję dzięki temu:
LogsDataBox[] DataBoxes
- Każdy LogsDataBox muszę przekonwertować do LogViewerItemProperty za pomocą FillList()
- 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);
}