【问题标题】:WP8 UnauthorizedAccessExceptionWP8 未授权访问异常
【发布时间】:2024-04-30 12:15:02
【问题描述】:

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

【问题讨论】:

  • 因为 OnInvoke 方法在您的 PeriodicTask 的线程上,但是您的方法中有一些控制必须在 UI 线程上执行。所以你必须在 Dispatcher 关联的线程上异步执行指定的委托。
  • 什么控制?我只使用 Linq 2 Sql。
  • 你的onInvoke方法中是否绑定任何数据来控制?
  • 抛出异常的具体行是什么?
  • 已编辑问题。这是第一行。

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


【解决方案1】:

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

BeginInvoke异步;因此,控制立即返回 调用对象后传给调用对象。

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

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

【讨论】:

  • 这很简单。但我除了 sql 查询,没有绑定,没有控件之外什么都不做。这是周期性任务 - 没有 UI,
  • Okk 因此,为了进一步检查,我们需要有关 TestCTX 对象的更多详细信息。如果可能,请添加完整的 TestCTX 类。