如何将后台任务添加到Windows应用商店应用

时间:2014-03-27 20:36:49

标签: c# .net windows-store-apps visual-studio-2013 background-process

使用c#,VS 2013

尝试向我的商店应用添加一些后台任务(如果我的Json文件中的某些数据包含当前日期和时间,则显示toast的想法。)

做了什么:

1. 创建Windows运行时组件,实现IBackgroundTask,添加对我的Windows应用商店应用的引用。在WRC内部创建包含下一个代码的类:

namespace BackgroundTask
{
public sealed class EventChecker: IBackgroundTask
{
    ThreadPoolTimer  _periodicTimer = null;
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        _periodicTimer 
            = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromSeconds(30));
    }

    private void PeriodicTimerCallback(ThreadPoolTimer timer)
    {
        CheckEventAndShowToast();
    }
     ....
}

2. 注册任务:在MainPage.xaml.cs中添加方法OnNavigatedTo注册此后台任务。代码:

        protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        navigationHelper.OnNavigatedTo(e);

        var taskName = "EventCheckerTask";
        if (BackgroundTaskRegistration.AllTasks.Count > 0)
        {
            foreach (var cur in BackgroundTaskRegistration.AllTasks)
            {
                if (cur.Value.Name != taskName)
                {
                    BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
                    builder.Name = taskName;
                    builder.TaskEntryPoint = "BackgroundTask.EventChecker";
                    BackgroundTaskRegistration taskToRegister = builder.Register();
                }
            }
        }
        else
        {
            BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
            builder.Name = taskName;
            builder.TaskEntryPoint = "BackgroundTask.EventChecker";
            BackgroundTaskRegistration taskToRegister = builder.Register();
        }
    }

使用MSDN1MSDN2MSDN3个链接。

同样OnComplete没有实施 - 因为我不需要它(或者我必须实施它?)

3. 在清单中声明。

设置能够"是":

的吐司

enter image description here

声明后台任务:

enter image description here

4.检查我想用于背景的所有方法的功能 - 一切正常和工作

Durring调试一切正常,没有错误/异常,但没有发生任何事情。尝试逐步调试 - 看起来一切都好,我觉得我在代码中犯了一些错误。

所以问题:我错了,为什么我无法启动必须检查数据的后台任务,如果需要某些条件,则需要采取必要的措施?

修改


第2部分 - 尝试在新解决方案中实现后台任务。

做了什么: 创建新的简单CRC

namespace Tasks
{
public sealed class Tasks : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        //for checking place debug point
       //TODO something 
    }
}
}

同样在main.xaml.cs中放置下一个代码:

protected override void OnNavigatedTo(NavigationEventArgs e)
    {           
        CheckTaskRegistration();
    }
    private void CheckTaskRegistration()
    {
        foreach (var task in BackgroundTaskRegistration.AllTasks)
        {
            if (task.Value.Name == "Tasks")
            {
                isTaskRegistered = true;
                break;
            }
        }
        if (!isTaskRegistered)
        {
            RegisterBackgroundTask2("Tasks", "Tasks.Tasks");
        }
    }

    private void RegisterBackgroundTask2(string name, string entrypoint)
    {
        BackgroundTaskBuilder btb = new BackgroundTaskBuilder();
        btb.Name = name;
        btb.TaskEntryPoint = entrypoint;
       //IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
       // btb.SetTrigger(everyMinuteTrigger);
        btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
        BackgroundTaskRegistration task = btb.Register();
    }

结果得到了,使用此触发器btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));一切正常 - 我可以进入Run方法,但如果我尝试使用TimeTrigger喜欢

       //IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
       // btb.SetTrigger(everyMinuteTrigger);

什么都没发生 - 等几分钟尝试几次(放置而不是触发注册)。

问题 - 为什么?我必须做更多的事情吗? 老问题也没有答案......

也尝试将它与我的应用程序一起使用 - 所有工作都完美,但只有当我连接到局域网...但为什么它不适用于时间触发器?

2 个答案:

答案 0 :(得分:5)

花费更多时间,发现问题的根本原因很少:

  1. 如果我想使用它并启动,我必须在BackgroundTask中使用一些触发器。这里的问题并不完全是我需要的东西(或者我可能需要阅读更多关于触发器的内容)。 因此,如果我添加一些触发器,可以在发生此类事件后启动BackgroundTask。例如:

    //Time trigger
    IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(15, false);
    btb.SetTrigger(everyMinuteTrigger);
    
    //one of the standart tirgger
    btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
    
  2. 如果我想使用TimeTrigger,在编辑中我用TimeTrigger(1, false);编写代码,但在阅读了一些更详细的文档后发现"时间触发器只接受大于或等于15的值;寄存器期间较小的值失败。" MSDN

  3. 此外,如果我想使用TimeTrigger,我必须将LockScreenNotification支持添加到我的应用程序

  4. 目前我可以每15分钟启动一次backgroundTask,但这并不是我想要的...... 所以,关于这个后期的问题 - 我找到了答案,但仍需要更深入地阅读BackgroundTask

答案 1 :(得分:2)

是你的CheckEventAndShowToast();什么异步调用?

如果是这种情况,那么您应该遵循您发布的MSDN2链接中的第4步。

“4。如果在后台任务中运行任何异步代码,那么后台任务需要使用延迟。如果不使用延迟,则后台任务进程可以在Run方法完成之前意外终止您的异步方法调用已完成。“

相关问题