Асинхронное заполнение ObservableCollection

228
02 сентября 2021, 15:50

Стоит задача : при инициализации выполняется заполнение ObservableCollection данными, где имеется трудоемкий метод.

private void AddToCollection()
{
  Music.Add(new SongModel
  {
      Title = Tag.Title ,
      Artis = Tag.Artist
      ShadowColor = au.GetShadowColor(bm),       
   });
}

где au.GetShadowColor(bm) метод который долго обрабатывается.

Вызываю его в

 public PageViewModel()
 {   
   AddToCollection();
 }

Пытаясь найти решение понял что данный метод лучше не вызывать в конструкторе. Тогда как и где его вызвать? Дальше вопрос как заполнять ObservableCollection так, чтобы не блокировать Ui и не ждать пока закончится заполнение чтобы отобразить окно программы?

UPDATE: Действительно была проблема в GetShadowColor. Поля нужно инициализировать именно в самом методе, а не в классе. Так как иначе при вызове метода несколько раз асинхронно, методы будут обращаться одновременно к одним и тем же полям, что впоследствии создает исключения.

Answer 1

Может так:

private async Task AddToCollection()
{
    Music.Add(new SongModel
    {
      Title = Tag.Title ,
      Artis = Tag.Artist
      ShadowColor = await Task.Run(()=> au.GetShadowColor(bm)),       
   });
}
READ ALSO
Наследование + event broadcasting

Наследование + event broadcasting

Заранее прошу прощения за невнятный заголовок, не придумал как лучше объяснить

91
The application exited with code: 255

The application exited with code: 255

При попытке запуска какой-либо программы через VS выдает такую ошибкуРаньше этого не было, но после обновления ОС на Mac'е началось

121
C#.Значение скобок в массиве массивов

C#.Значение скобок в массиве массивов

Обясните значение каждых скобок при объявлении массива массивов,ведь я понимаю только значение [3],что значит что длина массива - 3А вот почему...

167