Это странно.
Фоновый агент моего приложения для 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)
{
}
});
}
}
}
У кого-нибудь есть идеи, что может быть причиной этого, или у кого-нибудь был подобный опыт, когда фоновый агент работает только с отладочной сборкой?
Спасибо за ваше время.