我的应用程序中有一些带有本地数据库的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中?
答案 0 :(得分:0)
在WPF中,只有创建 DispatcherObject 的线程才能访问该对象。例如,从主UI线程中分离出来的后台线程无法更新在UI线程上创建的 Button 的内容。为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这可以通过使用 Invoke或BeginInvoke 来完成。 Invoke是同步的,BeginInvoke是异步的。该操作将添加到Dispatcher的事件队列中指定的DispatcherPriority。
BeginInvoke 是异步;因此,控件会立即返回 在调用它之后调用它。
调用是同步操作;因此,在回调函数返回之前,控件不会返回调用对象。
您可以从以下MSDN参考中阅读更多内容。 MSDN参考