J'utilise un BackgroundWorker WPF pour créer des vignettes. Ma fonction de travailleur ressemble à ceci :
private void work(object sender, DoWorkEventArgs e)
{
try
{
var paths = e.Argument as string[];
var boxList = new List<BoxItem>();
foreach (string path in paths)
{
if (!string.IsNullOrEmpty(path))
{
FileInfo info = new FileInfo(path);
if (info.Exists && info.Length > 0)
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 200;
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.UriSource = new Uri(info.FullName);
bi.EndInit();
var item = new BoxItem();
item.FilePath = path;
MemoryStream ms = new MemoryStream();
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bi));
encoder.Save(ms);
item.ThumbNail = ms.ToArray();
ms.Close();
boxList.Add(item);
}
}
}
e.Result = boxList;
}
catch (Exception ex)
{
//nerver comes here
}
}
Lorsque cette fonction est terminée et avant que la fonction "Completed" de BackgroundWorker soit lancée, je peux voir sur la fenêtre de sortie de Vs2008, qu'une exception est générée. Cela ressemble à :
A first chance exception of type 'System.NotSupportedException' occurred in PresentationCore.dll
Le nombre d'exceptions générées est égal au nombre de vignettes à générer.
En utilisant la méthode "essais et erreurs", j'ai isolé le problème : BitmapFrame.Create(bi)
La suppression de cette ligne (qui rend ma fonction inutile) supprime également l'exception.
Je n'ai pas trouvé d'explication à cela, ni de meilleure méthode pour créer des vignettes dans un fil de fond.