0

async/await などを使用して長時間実行されるコードをバックグラウンドに移動していますが、件名のエラーが発生します。タスクから WPF UI コントロールを更新できないことは承知していますが (ディスパッチャーを適切に追加しました)、クラス内のオブジェクトを更新するだけでこのエラーが発生します。例:

private WriteableBitmap TempImage;

public async void StartProcessing()
{
   WriteableBitmap LoadedImage =  new WriteableBitmap(await LoadImage(0)); //ERROR HERE
   LoadedImage.Freeze();
   TempImage = LoadedImage;
   // do more stuff
}

 private Task<BitmapImage> LoadImage(int imageIndex)
 {
    return Task.Run(() =>
       {
          FileStream fileStream = new FileStream(fileList[0], FileMode.Open, FileAccess.Read);

          var img = new BitmapImage();
          img.BeginInit();
          img.StreamSource = fileStream;
          img.EndInit();
          return img;
        });
  }

「フリーズ」のものは、それを解決しようとする現在の試みですが、返された画像をクラスレベルの変数に割り当てようとするとすぐに発生します。これは、UI スレッドがクラスをインスタンス化し、変数が UI スレッド コンテキストにあるためだと思いますが、解決方法がわかりませんか?

4

2 に答える 2

2

LoadImage で作成された BitmapImage をフリーズする必要がある場合もあります。さらに、画像を読み込んだ後、FileStream も閉じる必要があります。BitmapCacheOption.OnLoadしたがって、フラグを設定する必要があります。

using (var fileStream = new FileStream(fileList[0], FileMode.Open, FileAccess.Read))
{
    var img = new BitmapImage();
    img.BeginInit();
    img.CacheOption = BitmapCacheOption.OnLoad; // here
    img.StreamSource = fileStream;
    img.EndInit();
    img.Freeze(); // and here
    return img;
}
于 2013-05-15T10:12:32.880 に答える