l programa @Async aún congela la IU
Hola, estoy escribiendo un programa WPF que tiene miniaturas dentro de un ThumbnailViewer. Quiero generar primero las Miniaturas, luego generar asíncronamente las imágenes para cada miniatura.
No puedo incluir todo pero creo que esto es lo relevante
Método para generar las 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;
});
}
}
Cuando ejecuto el código anterior, funciona como si nunca agregara async / await / task al código. ¿Me estoy perdiendo de algo? Una vez más, lo que quiero es que la interfaz de usuario permanezca abierta y las imágenes en miniatura se llenen mientras se ejecuta GetImage. Entonces debería verlos uno a la vez.
ACTUALIZAR
Gracias a @Peregrine por señalarme en la dirección correcta. Hice mi interfaz de usuario con controles de usuario personalizados utilizando el patrón MVVM. En su respuesta lo usó y sugirió que usara mi viewModel. Entonces, lo que hice es agregar una propiedad de cadena a mi viewModel e hice un método asíncrono que recorre todas las miniaturas y establezco mi propiedad de cadena en BitmapImage y enlazo mi interfaz de usuario a esa propiedad. Por lo tanto, cada vez que actualice asincrónicamente la propiedad, la IU también se actualizará.