2014-02-11 34 views
0

我有本地数据库中的一些SQL代码在我的应用程序,它的工作原理:WP8 UnauthorizedAccessException

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

因为OnInvoke方法在您的PeriodicTask的线程上,但您的方法中有一些控件必须在UI线程上执行。因此您必须在Dispatcher关联的线程上异步执行指定的委托。 –

+0

什么控制?我只使用Linq 2 Sql。 –

+0

你是否绑定了onInvoke方法中的任何数据来控制? –

回答

0

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

的BeginInvoke异步;因此,控制立即返回到 主叫对象它被称为后。

调用同步操作;因此,直到回调返回后,控件才会返回到调用对象。

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

+0

这就是简单。但我什么都不做,但SQL查询,没有绑定,没有控制。它是周期性的任务 - 没有UI, –

+0

Okk因此,为了进一步检查,我们需要TestCTX对象的更多细节。如果可能的话请添加完整的TestCTX类。 –

相关问题