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 был нулевым.

Другие вопросы по тегам