しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

やっぱりスレッドは嫌い

サムネイルを生成する部分が画像が多いと結構時間のかかる処理になってしまうので、BackgroundWorker を使って別スレッドで処理させようと思い DoWork で BitmapImage を作成して ObservableCollection に追加するという処理を組みました。

void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BitmapImage image = new BitmapImage(new Url("ファイル名"));
    // thumbnail は ObservableCollection<BitmapImage>
    thumbnail.Add(image);
}

このコードだと ObservableCollection がメインスレッドで作成されたものならば、Add を呼び出したときに落ちます。BackgroundWorker.ReportProgress で追加するように変更すると、一見成功したように見えますが BitmapImage を使おうとした瞬間に落ちます。
これではスレッドを使えないので困った。BitmapImage をメインスレッドで作成すればいいんだろうけど、それでは何の意味もないと思うし……。