我正在使用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线程上下文中,但不知道如何解决它?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
您可以使用Dispatcher
将接受WriteableBitmap
的呼叫编组到创建它的线程上。