0

我正在为我的 Windows 应用商店应用程序(Win 8.1 应用程序)实现一个后台任务。我写了一个非常简单的测试类,注册它,提示访问,但是当我选择从调试工具栏调试任务时,什么也没有发生。我今天也多次等了15分钟,它没有输出任何东西。然而,它显示(从代码角度来看)任务已注册并且我没有生成任何异常。

后台任务:

    public sealed class BGFunMessage : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            Debug.WriteLine("Background " + taskInstance.Task.Name + " Starting...");
        }
    }

寄存器类:

    public class RegisterWorkers
{
    public static async void Run()
    {
        var taskRegistered = false;
        var taskName = "BGFunMessage";
        BackgroundTaskRegistration bTask = null;

        foreach (var task in BackgroundTaskRegistration.AllTasks)
        {
            if (task.Value.Name == taskName)
            {
                //taskRegistered = true;
                bTask = (BackgroundTaskRegistration)(task.Value);
                bTask.Unregister(true);
                break;
            }
        }

        if (!taskRegistered)
        {
            string entryPoint = typeof(BGFunMessage).FullName;

            bTask = RegisterBackgroundTask(entryPoint, taskName);
        }
    }

    public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string name)
    {
        var builder = new BackgroundTaskBuilder();

        builder.Name = name;
        builder.TaskEntryPoint = taskEntryPoint;
        builder.SetTrigger(new TimeTrigger(15, false));

        BackgroundTaskRegistration task = null;

        try
        {
            task = builder.Register();
        }
        catch (Exception ex)
        {
            LiveLog.WriteException(ex, LogType.WARNING);
        }

        return task;
    }
}

我如何从我的应用程序中的页面调用它:

RegisterWorkers.Run();

我尝试过遵循多个教程,这些教程大多都说同样的话。我还在使用从 GitHub 下载的 MSDN 示例,但表面上看不到任何使他们的代码与我的代码不同的东西(除了他们的 Register 方法返回一个 Task<>)。我能够调试示例项目后台任务,但不是我自己的。我在这里做错了什么吗?谢谢。

4

1 回答 1

1

经过数小时的故障排除后,我找到了解决问题的方法。我不确定为什么一定会这样,但它确实有效。最初(上面未指定),我在与我的应用程序相同的项目中拥有后台任务。我能发现的唯一区别是,无论我在哪里看到,后台任务都在一个 WINDOWS RUNTIME COMPONENT 项目中。我将我的代码拉出并放入它自己的项目中,并引用了 .DLL,现在一切正常。

但是,我应该注意,如果有人需要此修复程序 - 现在我无法再从 Azure 移动服务访问我的任何数据或 SyncContext,因为它目前的状态。我不知道我现在需要重新架构什么才能让它工作,但上面的问题现在已经解决了。

我会假设,你应该总是有一个共享代码库项目,你的主应用程序项目应该引用,这样我的后台任务也可以引用共享项目,我仍然可以访问我的模型和其他数据。

于 2016-01-18T21:22:38.787 回答