2011-06-29 58 views
4

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

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

// this line throws exception.... 
this.defaultSearchImage = new BitmapImage(); 

回答

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

+0

@AwkwardCoder - 是的,无论何时您需要操作UI元素(实例化或更新),那么它都必须在UI线程上完成。 – keyboardP

+0

在XAML中有