Csharp/C#教程:调用线程无法访问此对象,因为另一个线程拥有它(async / await / task)分享


调用线程无法访问此对象,因为另一个线程拥有它(async / await / task)

我正在使用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 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线程上下文中,但不知道如何解决它?

您可能还必须冻结在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; } 

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

上述就是C#学习教程:调用线程无法访问此对象,因为另一个线程拥有它(async / await / task)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1014828.html

(0)
上一篇 2021年12月31日
下一篇 2021年12月31日

精彩推荐