在WP7上创建BitmapImage的后台线程

4

当我在后台(线程池)线程上运行以下代码时,我收到了一个UnauthorizedAccessException(“无效的跨线程访问”),这是预期行为吗?

 var uri = new Uri("resourcevault/images/defaultSearch.png", UriKind.Relative);
 var info = Application.GetResourceStream(uri);

 // this line throws exception....
 this.defaultSearchImage = new BitmapImage();
1个回答

2

原因是因为后台线程不能直接用于更新UI。相反,您需要使用Dispatcher将数据调度到UI线程上。像这样:

var uri = new Uri("resourcevault/images/defaultSearch.png", UriKind.Relative);
var info = Application.GetResourceStream(uri);

Dispatcher.BeginInvoke(() => {        
    this.defaultSearchImage = new BitmapImage();
});

1
谢谢,看起来你只能在UI线程上创建BitmapImage类,这其实很有道理,因为它只会被UI使用,并且与UI内在地联系在一起... - AwkwardCoder
@AwkwardCoder - 是的,每当您需要操作UI元素(实例化或更新)时,都必须在UI线程上完成。 - keyboardP
1
@Agent_L - 抱歉,我不太明白。哪一部分还没有回答?CreateOptions属性的引入是为了使设置解码过程在后台线程而不是UI线程上更容易。但是,一旦解码完成,它仍然返回到UI线程,在那里显示。 - keyboardP
1
上面代码中 BeginInvoke 行之前的所有操作都在后台线程上进行。该赋值操作必须在 UI 线程上执行。 - keyboardP
1
@Agent_L - 在那篇文章发布时,背景创建是默认设置。Mango SDK 处于测试版阶段。http://blogs.msdn.com/b/slmperf/archive/2011/06/13/off-thread-decoding-of-images-on-mango-how-it-impacts-you-application.aspx - keyboardP
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接