Windows Phone 8.1中的BackgroundExecutionManager.RequestAccessAsync时未注册类(HRESULT异常:0x80040154)

时间:2015-09-15 10:47:12

标签: c# windows-phone-8 windows-phone-8.1

我正在尝试在我的项目中实现后台任务。所以我添加了Windows Runtime Component Project并从我的主Windows Phone 8.1 silverlight project中引用了它。但是当我调用下面的函数时,我得到了一个异常

  

"类型' System.Exception'的第一次机会异常发生在   mscorlib.ni.dll。附加信息:未注册的课程   (HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))"

        // Applications must have lock screen privileges in order to receive raw notifications
        BackgroundAccessStatus backgroundStatus = await BackgroundExecutionManager.RequestAccessAsync();

        // Make sure the user allowed privileges
        if (backgroundStatus != BackgroundAccessStatus.Denied && backgroundStatus != BackgroundAccessStatus.Unspecified)
        {
            OpenChannelAndRegisterTask();
        }
        else
        {
            // This event comes back in a background thread, so we need to move to the UI thread to access any UI elements
            Dispatcher.BeginInvoke(() =>
            {
                Debug.WriteLine("Lock screen access is denied");
            });
        }

为什么会这样?后来我创建了一个示例Windows手机项目,上面的代码工作正常。这个奇怪的问题会是什么原因?

如果您对此有任何疑问,请帮我解决此问题。

2 个答案:

答案 0 :(得分:3)

后台任务必须使用他们的班级名称在Package.appxmanifest中注册(“声明”)。

双击你的appxmanifest文件,进入声明并确保你有a)在那里声明后台任务b)它有更正的类名(如{{1} })在入口点下输入。

对于我来说,

NamespaceName.BackgroundTaskClassName失败了,因为我忘了注册我的后台任务而收到完全相同的错误消息。

(对于针对Windows 10而非8(.1)的读者而言:Frank Sposaro的答案不再适用于Windows 10,因为MSDN link他提供了正确的文档。)

答案 1 :(得分:2)

根据MSDN,您应该从UI线程运行RequestAccessAsync。您可能希望确保这种情况,如果需要,也许可以使用Dispatch。我已经看到它抛出了各种异常,也许REGDB_E_CLASSNOTREG就是其中之一。