Programa assíncrono ainda congelando a interface do usuário

Olá, estou escrevendo um programa WPF que possui miniaturas dentro de um ThumbnailViewer. Quero gerar primeiro as Miniaturas, depois gerar assincronamente as imagens para cada miniatura.

Não posso incluir tudo, mas acho que isso é relevante

Método para gerar as miniaturas.

public async void GenerateThumbnails()
{
   // In short there is 120 thumbnails I will load.
   string path = @"C:\....\...\...png";
   int pageCount = 120;

   SetThumbnails(path, pageCount);
   await Task.Run(() => GetImages(path, pageCount);
 }

 SetThumbnails(string path, int pageCount)
 {
    for(int i = 1; i <= pageCount; i ++)
    {
        // Sets the pageNumber of the current thumbnail
        var thumb = new Thumbnail(i.ToString());
        // Add the current thumb to my thumbs which is 
        // binded to the ui
        this._viewModel.thumbs.Add(thumb);
    }
  }

  GetImages(string path, int pageCount)
  {
       for(int i = 1; i <= pageCount; i ++)
       {
            Dispatcher.Invoke(() =>
            {
                var uri = new Uri(path);
                var bitmap = new BitmapImage(uri);
                this._viewModel.Thumbs[i - 1].img.Source = bitmap;
            });
        }
  }

Quando executo o código acima, ele funciona como se nunca adicionasse async / waitit / task ao código. Estou esquecendo de algo? Novamente, o que eu quero é que a interface do usuário permaneça aberta e as imagens em miniatura sejam preenchidas à medida que a GetImage é executada. Então eu deveria vê-los um de cada vez.

ATUALIZAR:

Agradeço a @Peregrine por me indicar a direção certa. Eu criei minha interface do usuário com controles de usuário personalizados usando o padrão MVVM. Em sua resposta, ele usou e sugeriu que eu usasse meu viewModel. Então, o que fiz foi adicionar uma propriedade string ao meu viewModel e criar um método assíncrono que percorre todas as miniaturas e configura minha propriedade string para BitmapImage e vincula minha interface de usuário a essa propriedade. Portanto, a qualquer momento, ele atualizaria de forma assíncrona a propriedade que a interface do usuário também atualizaria.

questionAnswers(4)

yourAnswerToTheQuestion