UWP - 无头应用程序在3或4小时后停止

时间:2017-08-18 10:29:18

标签: c# uwp headless

我有一个无头的UWP应用程序应该每10分钟从传感器获取数据并将其发送到云端。 当我从Raspberry Pi上的无头应用程序运行代码时,它会在3或4小时后停止测量,没有错误(我有很多日志)。这恰好是3或4个小时。如果我在8点,11点或12点启动应用程序,它就会停止......

看起来它已经停止了,因为我已经在测试中运行良好的取消令牌,但在这里它不再触发了。在设备门户中的应用程序管理器上,似乎应用程序正在运行。

我还注意到在Device Portal的Performance页面中,测量期间内存大约下降了8 MB。

奇怪的是,我在RPi和笔记本电脑上的头部应用程序中运行了相同的代码,而且运行得非常顺利。它连续工作超过16个小时,直到我停止它。在笔记本电脑和RPi上没有内存问题,应用程序在整个时间段内使用了相同数量的RAM。

在作为无头应用程序运行时会出现什么情况?

以下是我从无头应用程序调用代码的方法:

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 个答案:

答案 0 :(得分:0)

问题来自于我必须使用的第三方库,它必须与无头应用程序进行不同的调用。 如果SynchronizationContext.Current为null,则在内部创建自己的TaskScheduler。