2017-08-18 9 views
0

センサーから10分ごとにデータを取得してクラウドに送信するヘッドレスUWPアプリがあります。 Raspberry Piのヘッドレスアプリからコードを実行すると、3〜4時間後に測定が停止します。エラーはありません(ログがたくさんあります)。それはちょうど3または4時間です。私が8時、11時または12時にアプリを起動すると、ちょうど停止します...UWP - 3時間または4時間後にヘッドレスアプリが終了する

テストでうまく機能するキャンセルトークンがあるので停止しているようですが、ここではそれ以上発砲していません。デバイスポータルのAppマネージャーで、アプリが実行中であると表示されます。

また、デバイスポータルの[パフォーマンス]ページで、測定中にメモリが約8 MB低下していることに気付きました。

奇妙なことは、私がRPiのノート型アプリケーションとノートパソコンで同じコードを実行していて、とてもうまくいったことです。私はそれを止めるまで16時間以上連続して働いていました。ラップトップとRPiの両方で、メモリの問題はなく、このアプリは全期間同じ量のRAMを使用していました。

ヘッドレスアプリケーションとして実行した場合、この現象が発生する可能性がありますか?ここで

は、私はヘッドレスアプリからコードを呼び出す方法です:

private async Task GetMeasurementsAsync() 
     { 

      try 
      { 

       flow = services.GetService<IFlowManager<PalmSenseMeasurement>>(); 

       await flow.RunFlowAsync(); 

      } 
      catch (Exception ex) 
      { 

       Measurements.Add(new MeasurementResult() { ErrorMessage = ex.Message }); 
      } 

     } 

RunFlowAsync方法は、次のようになります。

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(); 
     } 

そして、ここでは、私が頭アプリからコードを呼び出す方法です:

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 
       } 
      } 
     } 
+0

私はあなたがこれを行ったと確信していますが、RunFlowAsync非同期メソッドでもキャッチしてみてください。 –

+0

@StuartSmith RunFlowAsyncのコードも追加しました –

答えて

0

問題はサードパーティライブラリからヘッドレスアプリとは違って呼び出さなければなりませんでした。 SynchronizationContext.Currentがnullの場合、内部的に独自のTaskSchedulerを作成していました。

+0

ライブラリは何ですか?これは、将来この回答を見る人を助け、同じ問題かどうかを判断するのに役立ちます。 – acelent

+0

@acelent私は働く会社のために特別に作られた独自のライブラリです。 –

関連する問題