首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法注册时间触发的后台任务

无法注册时间触发的后台任务
EN

Stack Overflow用户
提问于 2012-10-24 23:18:53
回答 5查看 4.7K关注 0票数 9

对于Windows8应用程序,我尝试在C#/Xaml中注册一个后台任务。很难说,但我猜我的后台任务被很好地注册了,但当我在Debug Location工具栏上点击我的后台任务的名称时,我的应用程序停止工作,没有任何消息。

我查看了事件查看器上的日志,得到:“具有入口点MyApp.Pages.SampleBackgroundTask和名称示例每小时后台任务的后台任务无法激活,错误代码为0x80010008。”

下面是我的代码:

代码语言:javascript
复制
   private async void Button_Click_BackgroundTask(object sender, RoutedEventArgs e)
    {
        string entryPoint = "MyApp.Pages.SampleBackgroundTask";
        string taskName = "Example hourly background task";
        TimeTrigger hourlyTrigger = new TimeTrigger(60, false);

        BackgroundTaskRegistration myBackGroundTaskRegistration =   RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, null);
        if(myBackGroundTaskRegistration != null)
        AttachProgressAndCompletedHandlers(myBackGroundTaskRegistration);
    }


   public static BackgroundTaskRegistration RegisterBackgroundTask(String taskEntryPoint,
                                                                    String name,
                                                                    IBackgroundTrigger trigger,
                                                                    IBackgroundCondition condition)
    {

        var taskRegistered = false;
        var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks;

        foreach (var item in iter)
        {
            var task = item.Value;
            if (task.Name == name)
            {
                taskRegistered = true;
                return item.Value as BackgroundTaskRegistration;
            }
        }


        var builder = new BackgroundTaskBuilder();

        builder.Name = name;
        builder.TaskEntryPoint = taskEntryPoint;
        builder.SetTrigger(trigger);

        if (condition != null)
        {

            builder.AddCondition(condition);
        }

        BackgroundTaskRegistration taskBack = builder.Register();

        return taskBack;
    }


       private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
    {
        task.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
        task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
    }


  private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
    {
        var progress = "Progress: " + args.Progress + "%";

    }


    private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
    {
        Debug.WriteLine("Hi");
    }

我在清单中添加了这个:

代码语言:javascript
复制
      <Extension Category="windows.backgroundTasks" EntryPoint="MyApp.Pages.SampleBackgroundTask">
      <BackgroundTasks>
        <Task Type="timer" />
      </BackgroundTasks>
    </Extension>

我是不是忘了什么?

谢谢你的帮助。

编辑:以下是my Task的代码,在我的一个项目页面中:

代码语言:javascript
复制
      public sealed class SampleBackgroundTask : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

        _deferral.Complete();
    }
}
EN

回答 5

Stack Overflow用户

发布于 2012-11-12 11:19:24

我也有这个问题。我在同一个项目中也有我的。我最终将任务移到了一个单独的项目中,从而使其正常工作。我必须将项目输出设置为windows运行时组件(在属性应用程序选项卡下)。另外,不要忘了将项目添加为引用。

票数 6
EN

Stack Overflow用户

发布于 2012-12-27 17:15:11

在运行BackgroundTask之前,您需要用户权限,您可以手动执行此操作:打开应用程序,单击“设置”图标中的“权限”,然后将“锁定屏幕”设置为“打开”。

您还可以在第一个屏幕加载以下内容时提示用户:

代码语言:javascript
复制
BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

不用说,后者将带来更好的用户体验。

票数 3
EN

Stack Overflow用户

发布于 2016-05-05 16:55:45

两年后,现在Windows10中的WinRT,Visual Studio2015。再一次,同样的问题。

请求者表示他们的后台任务位于同一项目中。这是行不通的:here是一篇关于后台任务的非常详尽的文章。此外,正如Tim所指出的,必须首先调用BackgroundExecutionManager.RequestAccessAsync()。但是,从8.1开始,如果省略了这个参数,就会返回the background task registration will fail in that case,所以您永远不会到达任务触发器失败的地方。

总结一下要求:

  • 'await BackgroundExecutionManager.RequestAccessAsync()‘first
  • 任务类必须在Windows运行时组件项目中
  • Windows运行时组件项目必须在调用应用程序的
  • 中引用任务类必须如上所述在应用程序的清单中声明,并具有完整的命名空间名称

<代码>H111 Windows运行时组件项目和使用它的应用程序必须面向相同的Windows版本。在Visual Studio ->中的解决方案资源管理器中,分别右击项目“->属性->应用程序”。针对->目标和目标版本的库选项卡->。

在我的示例中,我肯定已经完成了所有这些任务,但是任务不会被触发。调试跟踪显示“程序'0x72C backgroundTaskHost.exe‘已退出,代码为1",调试器在ExecutionEngineException上中断,目标计算机的事件日志(应用程序和服务日志和Microsoft -> Windows -> BackgroundTaskInfrastructure -> Operational)列出了各种创造性的、完全没有文档记录的windows错误代码:

“具有入口点和名称的后台任务无法激活,错误代码为0x8007001F (分别为0x800706BE /0x80131509)。”

失败是不稳定的:一开始,它们很少发生,并且在几次连续的程序运行中变得更糟,直到后台任务再也没有被调用。

当后台任务的名称空间名称被更改时(在所有任务注册、包清单和代码中),这首先修复了错误,然后随着时间的推移也变得更糟。

这种情况下的特殊情况是,应用程序是在远程目标计算机上开发的,并使用远程调试器进行调试。在每次调试器运行之前删除应用程序包可以消除错误。

因此,运行后台任务(0x8007001F / 0x800706BE / 0x80131509)时出现的这些错误似乎与未正确找到已注册的任务有关。这可能有助于确保任务已正确注销,并在运行新的修改之前删除应用程序包。Powershell命令:

代码语言:javascript
复制
Get-AppPackage | where name -eq <myAppPackageGuid> | Remove-AppPackage

只是在这里记录一下,以防有人遇到同样的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13052242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档