C# 如何将后台任务添加到Windows应用商店应用程序

C# 如何将后台任务添加到Windows应用商店应用程序,c#,.net,windows-store-apps,visual-studio-2013,background-process,C#,.net,Windows Store Apps,Visual Studio 2013,Background Process,使用c#,VS 2013 尝试向我的商店应用程序添加一些后台任务(如果Json文件中的某些数据包含当前日期和时间,则显示toast) 所做的工作: 1.创建实现IBackgroundTask的Windows运行时组件,添加对我的Windows应用商店应用程序的引用。在WRC内部创建包含下一个代码的类: namespace BackgroundTask { public sealed class EventChecker: IBackgroundTask { ThreadPoolTimer

使用c#,VS 2013

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

所做的工作:

1.创建实现
IBackgroundTask
的Windows运行时组件
,添加对我的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加载项方法中,导航到注册此后台任务。代码:

        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();
        }
    }
使用,链接

而且
OnComplete
没有实现-因为我不需要它(或者我必须实现它?)

3.在舱单中声明。

将toast capable设置为“是”:

声明后台任务:

4.检查我想用于后台的所有方法的功能-全部正常并工作

在调试过程中,一切正常,没有错误/异常,但什么也没发生。尝试一步一步地调试-看起来一切正常,我认为我在代码中犯了一些错误

所以问题:如果我错了,为什么我不能启动我的后台任务,必须检查数据并在某些条件符合要求的情况下执行所需的操作

编辑


第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(新的SystemTrigger(SystemTriggerType.InternetAvailable,false))所有工作-我可以进入
运行
方法,但如果我尝试使用
时间触发器
之类的

       //IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
       // btb.SetTrigger(everyMinuteTrigger);
没有发生任何事情-等待几分钟,尝试几次(放置在上一个触发器注册位置)

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


也尝试在我的应用程序中使用它-所有的工作都很完美,但只有当我连接到lan。。。但是为什么它不能与时间触发器一起工作呢?

是您的checkevent和showtoos();异步调用任何东西

如果是这种情况,那么你应该按照你发布的链接中的步骤4进行操作


4.如果在后台任务中运行任何异步代码,则后台任务需要使用延迟。如果不使用延迟,则如果运行方法在异步方法调用完成之前完成,则后台任务进程可能会意外终止A花多一点时间,发现问题的几个根本原因:

  • 如果我想使用它并启动,我必须在我的背景任务中使用一些触发器。这里的问题是,我需要的并不完全存在(或者我需要多读一点关于触发器的内容)。 所以,如果我添加一些触发器,则在此类事件发生后可以启动BackgroundTask。例如:

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

  • 另外,如果我想使用TimeTrigger,我必须将LockScreenNotification支持添加到我的应用程序中

  • 目前我可以每15分钟启动一次backgroundTask,但这并不是我想要的。。。
    所以,关于这个后等式,我找到了答案,但仍然需要更深入地阅读BackgroundTask

    是的,这个方法调用异步命令,我根据链接进行更新,但仍然没有任何内容。