来自封闭块的变量在匿名函数中变为空

一月
var client = new WebClient();
var bytes = client.DownloadData(webUrl); // <-- NOT null

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    BitmapImage img = new BitmapImage();
    img.BeginInit();
    img.StreamSource = new MemoryStream(bytes); // <-- null
    img.EndInit();
    img_DownloadCompleted(img, webUrl);
}));

bytes = null; // EDIT: This last line is what I did wrong. This line
              // of code is executed in PARALLEL with the anonymous 
              // function, and thus this variable is set to null
              // sometime while (or before) the lambda is executing.

上面的代码在线程中执行,以避免阻塞UI。

我正在尝试从互联网将图像下载到BitmapImage对象中。图像已正确下载,但是当我尝试在UI中使用(使用Dispatcher.Invoke)时,出现以下错误消息:The calling thread cannot access this object because a different thread owns it.

因此,我添加了在UI线程上创建图像的代码。但是现在,当代码到达时<-- null,变量指示的行bytes突然变为空。在执行进入匿名函数之前,它不为null。(我检查了调试器)

有人知道为什么吗?Google并不是很有帮助。

更改变量类型的bytes,以var不作任何区别。

阿列克谢·列文科夫(Alexei Levenkov)

很可能您以后要更改bytes变量,从而在匿名函数中修改“捕获的”值。就像是:

var bytes = client.DownloadData(webUrl); <-- NOT null
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
 ...  img.StreamSource = new MemoryStream(bytes); <-- null
 ...
}
bytes = null; // something like this - because why not? 

请注意,即使代码如下顺序和img.StreamSource = ... bytes = null;行,它实际上很可能会以相反的顺序(因为它运行在其他线程不确定性)执行。

您应该非常小心将在以后/在其他线程上异步执行的捕获。比较安全的选择是在单独的方法中创建匿名函数,这样您以后就无法更改捕获的变量了:

Action CreateBitmapAction(bytes[] bytes)
{
 return () =>
 {
    BitmapImage img = new BitmapImage();
    img.BeginInit();
    img.StreamSource = new MemoryStream(bytes);
    img.EndInit();
    img_DownloadCompleted(img, webUrl);
 };
}

Application.Current.Dispatcher.BeginInvoke(CreateBitmapAction(bytes));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用来自封闭范围的变量的函数节点数组

来自分类Dev

来自封闭工作簿的Excel单元格引用,使用单元格中的文件名

来自分类Dev

使用Nokogiri创建非自封闭的空标签

来自分类Dev

替换nodejs中未自封闭的br或img标签

来自分类Dev

变量“ fs”将变量隐藏在封闭的块中

来自分类Dev

OleDbAdapter错误,在封闭块中隐藏变量错误

来自分类Dev

如何处理来自封装函数的 Promise

来自分类Dev

在匿名函数中找到 return 的封闭 f

来自分类Dev

在MATLAB匿名函数中强制评估变量

来自分类Dev

在匿名函数中更改/获取变量

来自分类Dev

从匿名javascript函数中获取变量

来自分类Dev

Javascript:如何更改匿名函数中的变量

来自分类Dev

如何在匿名函数中访问变量?

来自分类Dev

变量“ TargetProcess”将一个变量隐藏在一个封闭的块中

来自分类Dev

变量“ TargetProcess”将一个变量隐藏在一个封闭的块中

来自分类Dev

Python中的封闭函数

来自分类Dev

德鲁伊中的封闭函数

来自分类Dev

匿名函数中参数块的用途是什么

来自分类Dev

Arraylist 在另一个函数中变为空

来自分类Dev

从匿名内部类中引用封闭类'this

来自分类Dev

this.some_property在匿名回调函数中变为未定义

来自分类Dev

如何在匿名函数中访问函数变量

来自分类Dev

JavaScript中来自String的变量和函数

来自分类Dev

CSS块中的未封闭报价

来自分类Dev

C中的封闭/功能块

来自分类Dev

C中的封闭/功能块

来自分类Dev

如何在jQuery中的匿名函数中获取变量?

来自分类Dev

如何在jQuery中的匿名函数中获取变量?

来自分类Dev

自调用匿名函数与匿名函数中变量状态的范围和维护

Related 相关文章

热门标签

归档