WPFBackgroundWorkerを使用してサムネイルを作成しています。私のワーカー関数は次のようになります。
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
}
}
この関数が終了し、BackgroundWorkerの「完了」関数が開始される前に、Vs2008の出力ウィンドウで例外が生成されていることがわかります。次のようになります。
A first chance exception of type 'System.NotSupportedException' occurred in PresentationCore.dll
生成される例外の数は、生成されるサムネイルの数と同じです。
「試行錯誤」の方法を使用して、問題を次のように分離しました:BitmapFrame.Create(bi)
その行を削除すると(私の関数が役に立たなくなります)、例外も削除されます。
これについての説明や、バックグラウンドスレッドでサムネイルを作成するためのより良い方法は見つかりませんでした。