Search code examples
c#windows-phone-8.1windows-phonebackground-task

Windows Phone 8.1 background task closes before completion


My background task takes a long time to complete, and the OS is just killing it. I'm trying to sync my contacts online, here's what I'm doing:

  1. Get all contacts from phonebook (takes ~1 second)

  2. Upload them to a server (~2 seconds)

  3. Retrieve all contacts from server (~2-3 seconds)

  4. Delete all contacts from ContactStore(ContactStore.DeleteAsync sometimes takes 1 minute to complete)

  5. Create a ContactStore and import all contacts )(~1-2 minutes for 1000 contacts)

I have ~100 contacts and it's working well, but I wanted to test with ~1000 contacts and it doesn't complete every time. I'm using a MaintenanceTrigger, but I think it's still too much for a background task, but I need a confirmation for this. MaintenanceTrigger tasks should be allowed to do more resource intensive tasks, so why is the OS killing my background task?


Solution

  • Take a look at this link: https://msdn.microsoft.com/en-us/library/windows/apps/hh202942(v=vs.105).aspx

    Resource intensive tasks are constrained to a duration of 10 minutes.

    The following constraints must be met before the task is started. If the device stop fulfilling these constraints the agent is terminated immediately.

    • External power required
    • Non-cellular connection required
    • Minimum battery power
    • Device screen lock required
    • No active phone call
    • Cannot change network to cellular

    Besides this there are also a memory cap of respectively 11mb and 20mb for low/high end devices.

    From your description above the most likely scenario IMO is the memory cap being hit. Maybe this post can help you look into the memory usage of your background task: How to get memory available or used in C#

    Key changes to memory limits starting in Windows Phone 8.1 include (found here):

    • All Windows Phone 8 foreground apps are treated the same. We no longer have different memory caps for XNA, native or Silverlight apps.
    • Windows Phone 8.1 apps (including both Silverlight 8.1 and Windows Runtime) apps do have slightly higher caps than Windows Phone 8 apps.
    • Memory caps for all app types, including Continuous Background Execution (CBE), scale up with increased memory.
    • There is no longer a "default" and "higher" cap - there is only the default cap.
    • The ID_FUNCCAP_EXTEND_MEM manifest entry is ignored for all apps running on Windows Phone 8.1.
    • The ID_REQ_MEMORY_300 manifest entry is still valid, but you should really make your app run on all devices.
    • The new equivalent of ID_REQ_MEMORY_300 is below. This entry should be added to the AppX manifest (not to the WMAppManifest).