[英]System.UnauthorizedAccessException: Invalid cross-thread access while updating ListPicker in WP8
[英]WP8 UnauthorizedAccessException
我的应用程序中有一些带有本地数据库的SQL代码,它可以正常工作:
using(var ctx = new TestCTX()){
var res = ctx.Test.ToList();
}
然后我想在OnInvoke方法的PeriodicTask中使用它,我得到UnauthorizedAccessException
:
public override void OnInvoke(ScheduledTask){
using(var ctx = new TestCTX()){
var res = ctx.Test.ToList();
}
}
但随后我将其包装为:
public override void OnInvoke(ScheduledTask task){
Deployment.Current.Dispatcher.BeginInvoke(()=>{
using(var ctx = new TestCTX()){
var res = ctx.Test.ToList();
}
});
}
然后就可以了。 所以这是一个问题:为什么我必须将其包装到BeginInvoke中?
在WPF中,只有创建DispatcherObject的线程才能访问该对象。 例如,从主UI线程分离出来的后台线程无法更新在UI线程上创建的Button的内容。 为了使后台线程访问Button的Content属性,后台线程必须将工作委派给与UI线程关联的Dispatcher。 这可以通过使用Invoke或BeginInvoke来实现 。 调用是同步的,而BeginInvoke是异步的。 该操作将以指定的DispatcherPriority添加到Dispatcher的事件队列中。
BeginInvoke是异步的 ;因此,控制在被调用后立即返回到调用对象。
调用是同步操作; 因此,直到回调返回之后,控制权才返回到调用对象。
您可以从下面的MSDN参考中阅读更多信息。 MSDN参考
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.