UWP - приложение без головы останавливается через 3 или 4 часа
У меня есть безголовое приложение UWP, которое должно получать данные от датчика каждые 10 минут и отправлять их в облако. Когда я запускаю код из приложения без головы на Raspberry Pi, он перестает измерять через 3 или 4 часа, без ошибок (у меня много журналов). Это ровно 3 или 4 часа. Если я запускаю приложение в 8, в 11 или 12 оно просто останавливается...
Похоже, что он остановлен, потому что у меня есть токен отмены, который хорошо работал в тестах, но здесь он больше не срабатывает. В диспетчере приложений на портале устройств кажется, что приложение запущено.
На странице "Производительность" на портале устройств я также заметил, что во время измерений объем памяти уменьшается примерно на 8 МБ.
Странно то, что я запустил один и тот же код из заголовочного приложения на RPi и на ноутбуке, и все прошло очень хорошо. Он работал непрерывно более 16 часов, пока я не остановил его. Как на ноутбуке, так и на RPi проблем с памятью не было, приложение использовало одинаковое количество оперативной памяти в течение всего периода.
Что может вызвать такое поведение при запуске в качестве приложения без монитора?
Вот как я вызываю код из безголового приложения:
BackgroundTaskDeferral deferral;
private ISettingsReader settings;
private ILogger logger;
private IFlowManager<PalmSenseMeasurement> flow;
private IServiceProvider services;
IBackgroundTaskInstance myTaskInstance;
public async void Run(IBackgroundTaskInstance taskInstance)
{
taskInstance.Canceled += TaskInstance_Canceled;
deferral = taskInstance.GetDeferral();
myTaskInstance = taskInstance;
try
{
SetProperties();
var flowTask = flow.RunFlowAsync();
await flowTask;
}
catch (Exception ex)
{
logger.LogCritical("#####---->Exception occured in StartupTask (Run): {0}", ex.ToString());
}
}
private void SetProperties()
{
services = SensorHubContainer.Services;
settings = services.GetService<ISettingsReader>();
flow = services.GetService<IFlowManager<PalmSenseMeasurement>>();
logger = services.GetService<ILogger<StartupTask>>();
}
private void TaskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
logger.LogDebug("StartupTask.TaskInstance_Canceled() - {0}", reason.ToString());
deferral.Complete();
}
А вот как я вызываю код из заголовочного приложения:
private async Task GetMeasurementsAsync()
{
try
{
flow = services.GetService<IFlowManager<PalmSenseMeasurement>>();
await flow.RunFlowAsync();
}
catch (Exception ex)
{
Measurements.Add(new MeasurementResult() { ErrorMessage = ex.Message });
}
}
Метод RunFlowAsync выглядит следующим образом:
public async Task RunFlowAsync()
{
var loopInterval = settings.NoOfSecondsForLoopInterval;
while (true)
{
try
{
logger.LogInformation("Starting a new loop in {0} seconds...", loopInterval);
//check for previous unsent files
await resender.TryResendMeasuresAsync();
await Task.Delay(TimeSpan.FromSeconds(loopInterval));
await DoMeasureAndSend();
logger.LogInformation("Loop finished");
}
catch (Exception ex)
{
logger.LogError("Error in Flow<{0}>! Error {1}", typeof(T).FullName, ex);
#if DEBUG
Debug.WriteLine(ex.ToString());
#endif
}
}
}
1 ответ
Проблема была в сторонней библиотеке, которую мне приходилось использовать, и она должна была вызываться не так, как приложение без наушников. Внутренне он создавал свой собственный TaskScheduler, если SynchronizationContext.Current был нулевым.