Фоновый агент Windows Phone 8 запускается только при использовании отладочной сборки (похоже, не запускается в выпускной сборке)

Это странно.

Фоновый агент моего приложения для Windows Phone 8, кажется, обновляется абсолютно нормально в течение дня, когда я запускаю отладочную сборку. Однако, когда я перехожу на релизную сборку, она либо вообще не запускается, либо запускается очень редко. Это для приложения погоды: содержимое моей живой плитки должно меняться каждый час. Я видел, как он иногда обновлялся каждый час, но потом останавливался на несколько часов, а потом вдруг начинался снова. Ни в коем случае фоновый агент приложения не блокируется ОС, что говорит мне о том, что с фоновым агентом все в порядке, или он просто мало работает/вообще.

На данный момент у меня есть отладочная и выпускная сборки приложения на моем Lumia 1020 под управлением Windows Phone 8.1. По коду они идентичны. Сборка отладки обновляется каждые 30 минут (я знаю причину отметки времени на активной плитке), тогда как сборка выпуска не обновлялась ни разу с тех пор, как была создана 90 минут назад (но ее фоновый агент по-прежнему указан как «разрешенный» для запустите приложение Battery Saver).

Вот метод, который создает агент:

    private void AddAgent(string periodicTaskName)
    {
        periodicTask = ScheduledActionService.Find(periodicTaskName) as PeriodicTask;
        if (periodicTask != null)
        {
            RemoveAgent(periodicTaskName);
        }

        periodicTask = new PeriodicTask(periodicTaskName);
        periodicTask.Description = "LiveTileHelperUpdateTask";

        try
        {
            ScheduledActionService.Add(periodicTask);

            // If debugging is enabled, use LaunchForTest to launch the agent in 5 seconds.
            //#if(DEBUG_AGENT)
               ScheduledActionService.LaunchForTest(periodicTaskName, TimeSpan.FromSeconds(1));
            //#endif
        }
        catch (InvalidOperationException)
        {

        }
        catch (SchedulerServiceException)
        {

        }
    }

А вот запланированный код агента:

public class ScheduledAgent : ScheduledTaskAgent
{
    /// <remarks>
    /// ScheduledAgent constructor, initializes the UnhandledException handler
    /// </remarks>
    static ScheduledAgent()
    {
        // Subscribe to the managed exception handler
        Deployment.Current.Dispatcher.BeginInvoke(delegate
        {
            Application.Current.UnhandledException += UnhandledException;
        });
    }

    /// Code to execute on Unhandled Exceptions
    private static void UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
    {
        if (Debugger.IsAttached)
        {
            // An unhandled exception has occurred; break into the debugger
            Debugger.Break();
        }
    }

    /// <summary>
    /// Agent that runs a scheduled task
    /// </summary>
    /// <param name="task">
    /// The invoked task
    /// </param>
    /// <remarks>
    /// This method is called when a periodic or resource intensive task is invoked
    /// </remarks>
    protected async override void OnInvoke(ScheduledTask task)
    {
        // If the app has not been purchased and trial has expired,
        // don't do anything here.
        if( (bool) IsolatedStorageSettings.ApplicationSettings["TrialExpired"] == true )
            return;

        // Setup view model to get data from.    
        LiveTileViewModel viewModel = new LiveTileViewModel();
        await viewModel.getWeatherForTileLocation();

        // Use a dispatcher because we are NOT on the UI thread!
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            try
            {                
                RadFlipTileData extendedData = new RadFlipTileData();
                extendedData.IsTransparencySupported = true;

                // Determine which sized tile will be the live tile.
                // Only create a live tile for it due to memory constraints.
                string liveTileSize = IsolatedStorageSettings.ApplicationSettings["LiveTileSize"].ToString();
                switch (liveTileSize)
                {
                    case "SMALL TILE":
                        extendedData.SmallVisualElement = new LiveTileSmall()
                        {
                            Icon = viewModel.Location.Hourly.Data[0].Icon,
                            Temperature = viewModel.Location.Hourly.Data[0].Temperature
                        };
                    break;
                    case "REGULAR TILE":
                        // Code here similar to small tile's
                    break;
                    default:
                        // Code here similar to small tile's
                    break;
                }

                FreeMemory();

                foreach (ShellTile tile in ShellTile.ActiveTiles)
                {
                    LiveTileHelper.UpdateTile(tile, extendedData);
                    break;
                }

                NotifyComplete();
            }
            catch (Exception e)
            {
            }
        }); 
    }
}
}

У кого-нибудь есть идеи, что может быть причиной этого, или у кого-нибудь был подобный опыт, когда фоновый агент работает только с отладочной сборкой?

Спасибо за ваше время.


comment
Попробуйте записать все ошибки в файл в агенте. Оберните весь свой код в try catch и войдите в него. Держите его маленьким, так как вам может не хватать памяти. Может быть, было бы хорошо просто регистрировать все действия, возможно, даже настроить службу, в которую она может отправлять данные, а не полагаться на локальный текстовый файл. Вы можете использовать Google Analytics для быстрой отладки.   -  person Shawn Kendrot    schedule 26.07.2014
comment
Пожалуйста, помогите нам в решении этой проблемы. Фоновая задача не запускается, когда для отладки установлен режим выпуска. Он работал нормально в режиме отладки. А для проекта Windows Phone 8.1 мы не можем загрузить файл .xap, встроенный в режим отладки. Его нужно установить в режиме выпуска, но когда мы устанавливаем режим выпуска, фоновая задача не работает.   -  person Balasubramani M    schedule 19.08.2014
comment
У меня такая же проблема.   -  person Martin Komischke    schedule 03.09.2014
comment
У меня возникла аналогичная проблема с фоновой задачей WP81. Продолжает ли выполняться фоновая задача после перезагрузки телефона с отладочной сборкой?   -  person Tim    schedule 22.09.2014


Ответы (1)


Вы пытались удалить отладочную сборку и установить выпуск, чтобы проверить выполнение фоновой задачи?

А также попробуйте удалить ScheduledActionService.LaunchForTest для сборки релиза, см. раздел с предостережениями в документации. В текущем коде вы указали запускать тестовый запуск фоновой задачи каждую 1 секунду. Есть ограничение, в некоторых случаях, если это время меньше 60 секунд, задача может не запуститься.

person Mahender    schedule 16.01.2015