1

Стоит задача : при инициализации выполняется заполнение 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. Поля нужно инициализировать именно в самом методе, а не в классе. Так как иначе при вызове метода несколько раз асинхронно, методы будут обращаться одновременно к одним и тем же полям, что впоследствии создает исключения.

Anulyev
  • 335

1 Answers1

1

Может так:

private async Task AddToCollection()
{
    Music.Add(new SongModel
    {
      Title = Tag.Title ,
      Artis = Tag.Artist
      ShadowColor = await Task.Run(()=> au.GetShadowColor(bm)),       
   });
}
tym32167
  • 32,857
  • var sc = await Task.Run(() => au.GetShadowColor(bm)); Появляется ошибка "ссылка на объект не указывает на экземпляр объекта" – Anulyev Oct 08 '19 at 13:24
  • где появляется, что именно у вас равно null? – tym32167 Oct 08 '19 at 13:26
  • скорее всего sc=null. Ошибка выскакивает при инициализации программы при присваивание значения для DataContext – Anulyev Oct 08 '19 at 13:29
  • это может быть тольео ксли вот это au.GetShadowColor(bm) вернуло null – tym32167 Oct 08 '19 at 13:31
  • Да так как на половине выполнения метода вылетает эта ошибка, соответственно до return не доходит – Anulyev Oct 08 '19 at 13:50
  • ну вам наверное надо глядеть внутрь метода GetShadowColor, и пользоваться дебагером. – tym32167 Oct 08 '19 at 14:03