0

I have some SQL code with local database in my App, it works:

using(var ctx = new TestCTX()){
     var res = ctx.Test.ToList();
}

Then I want to use it in PeriodicTask in OnInvoke method, I get UnauthorizedAccessException:

public override void OnInvoke(ScheduledTask){
    using(var ctx = new TestCTX()){
        var res = ctx.Test.ToList();
    }
}

But then I wrap it to:

public override void OnInvoke(ScheduledTask task){
    Deployment.Current.Dispatcher.BeginInvoke(()=>{     
         using(var ctx = new TestCTX()){
             var res = ctx.Test.ToList();
         }
    });   
}

Then it works. So here is the question: Why must I wrap it into BeginInvoke ?

4

1 回答 1

0

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

BeginInvoke异步的;因此,控制在调用对象后立即返回到调用对象。

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

您可以从下面的 MSDN 参考中了解更多信息。 MSDN参考

于 2014-02-11T07:42:42.850 回答