2017-08-18 20 views
1

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プロパティもチェックしようとしました。決して真実にはならない。

主な要件は、機能の展開時にいずれかの操作/データを失うことはありませんが、私は、ホストが、更新後に再起動後に処理されるように、いくつかのデータを永続化するようにアプリが停止されていることを知ってほしいです。

+0

正確なフローを共有しているマインド?コードのデプロイメントからのシャットダウンを起動していますか?あなたは、アプリケーションが停止したとき、どのようなアプリケーションの停止を言っているのですか?また、あなたに与えられたロガーインスタンスは、関数呼出しにスコープされた生涯スコープが限られていることに注意してください。したがって、静的にそのインスタンスを保持することは期待どおりに機能しないため、トークンが通知されたかどうかを検出する信頼できる方法ではありません。 –

+0

まだプロダクションコードが表示されないようにアプリをアップデートする際にPOCを実行しています。私がやろうとしているのは、データをすばやく(キュー内で)保持し、アプリケーションが停止する前に機能から抜け出すことです。私は、アプリケーションの再デプロイメントのためにデータ/操作が失われていないことを確認することができます(アプリのシャットダウンにつながります)。 関数でIsCancellationRequestedをチェックしても、trueにはなりません。 – akazemis

答えて

2

あなたのコードに基づいて、私はここに、私の側にそれをテストは、私のテスト結果である:上記のスクリーンショットから

enter image description here

enter image description here

、私たちは、その後のラウンドができなかったことを見つけることができます最初のラウンドを除くキャンセルコールバックを処理します。ファビオCavalcanteがコメントしたように、私は_isFirst論理チェックを削除し、次のように、それはすべてのラウンドのために働くことができた:

enter image description here

注:私はTimerTriggerがあるときに私の機能を無効にして、私のホストのシャットダウンをシミュレートトリガーされた。

+0

おかげで、私の主な問題は、setting.jobファイルのデフォルトのstopped_wait_timeでした。それを2分になる120に増やした。適切なログを取得し始めましたが、断続的です。ときどき動作しない場合もあります。 – akazemis

関連する問題