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 回答
0

您可以使用 将Dispatcher访问 的调用编组WriteableBitmap到创建它的线程上。

于 2013-05-15T10:04:22.393 回答