Вопрос

using c#, VS 2013

Try to add some background task to my Store app (idea to show toast if some data in my Json file contains current date and time).

What was done:

1.Create Windows Runtime Component, that implement IBackgroundTask , add reference to my Windows Store App. Inside WRC create class that contains next code :

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.Register task : In MainPage.xaml.cs add in method OnNavigatedTo registering of this background task. Code:

        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();
        }
    }

Use MSDN1, MSDN2, MSDN3 links.

Also OnComplete not implement - because i don't need it (or I must to implement it anyway?)

3.Declare in manifest.

Set toast capable to "YES":

enter image description here

Declare background Task:

enter image description here

4.Check functionality of all method that i want to use for background - all Ok and work

Durring debugging all it's ok, no errors/ exceptions, but nothing happend. Try to debug step by step - looks like all it's ok, think i make some mistake in code.

So question: where i'm wrong, why i cant launch my background task that must to check data and do required action if some conditions are as required?

EDIT


Part 2 - Try to realize background task in new solution.

What was done: Create new simple CRC :

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

Also in main.xaml.cs placed next code:

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();
    }

As result got, that with this trigger btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false)); all works - i can go inside Run method, but if I try to use TimeTrigger like

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

nothing happend - wait few minutes try few times (placed instead prev trigger registration).

Question - Why? Do i must to do something more? Also old questions are without answers too...

Also try to use it with my App - all worksperfect, but only if i connect to lan... But why it's not work with time trigger?

Это было полезно?

Решение

A spend a little bit more time and found few root causes for my problem:

  1. I must to use some trigger with my BackgroundTask if I want to use it and launch. problem here that ther is not exactly what i need exist (or maybe i need to read a little bit more about triggers). So if I add some trigger, BackgroundTask can be launched after such event happend. Example:

    //Time trigger
    IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(15, false);
    btb.SetTrigger(everyMinuteTrigger);
    
    //one of the standart tirgger
    btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
    
  2. If I want to use TimeTrigger, in EDIT i write code with TimeTrigger(1, false);, but after reading some more detailed documentation found "that the time trigger only accepts values greater than or equal to 15; smaller values fail during Register." MSDN

  3. Also if I want to use TimeTrigger i must to add LockScreenNotification support to my App

Currently I can launch backgroundTask every 15 min, but it's not exactly what i want... So, regarding this post quation - i found answer, but still need to read more deeply about BackgroundTask

Другие советы

Is your CheckEventAndShowToast(); calling anything asynchronously?

If that is the case then you should follow step 4 from the MSDN2 link you posted.

"4. If you run any asynchronous code in your background task, then your background task needs to use a deferral. If you don't use a deferral, then the background task process can terminate unexpectedly if the Run method completes before your asynchronous method call has completed."

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top