1. ホーム
  2. c#

[解決済み] タイマートリガーのAzure Functionをローカルに一度だけ実行する最も簡単な方法は何ですか?

2023-04-03 07:54:18

質問

C# の Azure Functions をいくつか持っていて、スケジュールで実行するために タイマートリガ . このように設定しました。 %TimerSchedule% は、アプリの設定にあるcron式を参照しています。

public static void Run([TimerTrigger("%TimerSchedule%")]TimerInfo myTimer, TraceWriter log)

開発中、Azure Functions Tools for Visual Studio + Azure Functions Core Tools を使って、ローカルで関数を実行したいことがよくあります。しかし、ローカルで関数をデバッグするためにF5を押すと、(通常は)すぐに実行されません。代わりに、タイマーのスケジュールに従って、次の発生を待ち始めます。したがって、たとえば、私の cron 式が毎日午後 8 時に実行するように言っている場合、私のマシン上で関数が実際に実行されるには午後 8 時まで待つ必要があります。

そこで質問です。 関数をローカルで一度実行させる最も簡単で最良の方法は何でしょうか?

私が試したこと、考えたこと。

  1. ローカル開発のために、より頻繁なタイマースケジュールを使用する。
    • これはOKですが、完璧ではありません。非常に頻繁に実行されない限り、まだ少し待たなければなりませんし、非常に頻繁に実行される場合、関数が複数回実行されるかもしれません。これは私が今やっていることです。
  2. 関数を直接呼び出すコンソールアプリまたはユニットテストを書きます。 Run() メソッドを呼び出します。
    • を提供しなければならないので、これは100%簡単なことではありません。 TimerInfoTraceWriter の引数を Run() - であり、それに関するドキュメントは驚くほど少ないことがわかりました。

マイクロソフトの Azure Functionsでコードをテストするための戦略 のページは、このトピックに関してあまり役に立ちません。 その他の をテストする方法としてタイマトリガーを挙げているだけです。

完璧な世界では、F5 を押すと関数がすぐに一度だけ実行されます - まるで通常の .NET アプリを開発しているように。

どのように解決するのですか?

私も同じ質問があり、DEBUG-flagを使用して、デバッグ中のみRunOnStartupを行うようにしました。

        public static void Run(
            [TimerTrigger("* 0 7 * * 1-5"
#if DEBUG
            , RunOnStartup=true
#endif
            )]TimerInfo myTimer, TraceWriter log)
        {