Azureの機能で起動されません。CancellationTokenは、私はこの単純なAzureの機能を持っている
public static class MyCounter
{
public static int _timerRound = 0;
public static bool _isFirst = true;
[FunctionName("Counter")]
//[TimeoutAttribute("00:00:05")]
public async static Task Run([TimerTrigger("*/10 * * * * *")]TimerInfo myTimer, TraceWriter log, CancellationToken token)
{
try
{
log.Info($"C# Timer trigger function executed at: {DateTime.UtcNow}");
if (_isFirst)
{
log.Info("Cancellation token registered");
token.Register(async() =>
{
log.Info("Cancellation token requested");
return;
});
_isFirst = false;
}
Interlocked.Increment(ref _timerRound);
for (int i = 0; i < 10; i++)
{
log.Info($"Round: {_timerRound}, Step: {i}, cancel request:{token.IsCancellationRequested}");
await Task.Delay(500, token).ConfigureAwait(false);
}
}
catch (Exception ex)
{
log.Error("hold on, exception!", ex);
}
}
}
私はアプリが停止したり、コードの再デプロイ時にCancellationToken要求イベントをキャプチャしてやろうとしています起こった(ホストシャットダウンイベント)。
私はまた、forループのIsCancellationRequestedプロパティもチェックしようとしました。決して真実にはならない。
主な要件は、機能の展開時にいずれかの操作/データを失うことはありませんが、私は、ホストが、更新後に再起動後に処理されるように、いくつかのデータを永続化するようにアプリが停止されていることを知ってほしいです。
正確なフローを共有しているマインド?コードのデプロイメントからのシャットダウンを起動していますか?あなたは、アプリケーションが停止したとき、どのようなアプリケーションの停止を言っているのですか?また、あなたに与えられたロガーインスタンスは、関数呼出しにスコープされた生涯スコープが限られていることに注意してください。したがって、静的にそのインスタンスを保持することは期待どおりに機能しないため、トークンが通知されたかどうかを検出する信頼できる方法ではありません。 –
まだプロダクションコードが表示されないようにアプリをアップデートする際にPOCを実行しています。私がやろうとしているのは、データをすばやく(キュー内で)保持し、アプリケーションが停止する前に機能から抜け出すことです。私は、アプリケーションの再デプロイメントのためにデータ/操作が失われていないことを確認することができます(アプリのシャットダウンにつながります)。 関数でIsCancellationRequestedをチェックしても、trueにはなりません。 – akazemis