WP8 UnauthorizedAccessException

时间:2014-02-11 05:00:44

标签: c# .net windows-phone-8 unauthorizedaccessexcepti

我的应用程序中有一些带有本地数据库的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中?

1 个答案:

答案 0 :(得分:0)

在WPF中,只有创建 DispatcherObject 的线程才能访问该对象。例如,从主UI线程中分离出来的后台线程无法更新在UI线程上创建的 Button 的内容。为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这可以通过使用 Invoke或BeginInvoke 来完成。 Invoke是同步的,Be​​ginInvoke是异步的。该操作将添加到Dispatcher的事件队列中指定的DispatcherPriority。

BeginInvoke 异步;因此,控件会立即返回     在调用它之后调用它。

调用同步操作;因此,在回调函数返回之前,控件不会返回调用对象。

您可以从以下MSDN参考中阅读更多内容。 MSDN参考