Фоновый агент 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)
{
}
});
}
}
}
Кто-нибудь получил какие-либо идеи, что может быть причиной этого, или имел подобный опыт, когда фоновый агент работает только на отладочной сборке?
Спасибо за ваше время.
1 ответ
Вы пытались удалить отладочную сборку и установить выпуск, чтобы проверить выполнение фоновой задачи?
А также попробуйте удалить вызов метода ScheduledActionService.LaunchForTest для сборки выпуска, см. Раздел предостережения в документации. В текущем коде вы указали запуск тестового запуска фоновой задачи каждую 1 секунду. Существует ограничение, в некоторых случаях, если это время меньше 60 секунд, задача может не запускаться.