センサーから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
}
}
}
私はあなたがこれを行ったと確信していますが、RunFlowAsync非同期メソッドでもキャッチしてみてください。 –
@StuartSmith RunFlowAsyncのコードも追加しました –