c# - microsoft - serverless azure tutorial




¿Cuál es la forma más sencilla de ejecutar una función de Azure activada por temporizador una vez localmente? (2)

Tengo algunas funciones de C # Azure que se ejecutan de forma programada mediante el uso de temporizadores . Los he configurado como tal, donde %TimerSchedule% refiere a una expresión cron en la configuración de la aplicación:

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

Durante el desarrollo, a menudo quiero ejecutar las funciones localmente utilizando las herramientas de funciones de Azure para Visual Studio + Funciones básicas de las funciones de Azure. Pero cuando presiono F5 para depurar la función localmente (generalmente) no se ejecuta inmediatamente. En su lugar, comienza a esperar la próxima aparición según el cronograma del temporizador. Entonces, por ejemplo, si mi expresión cron dice que se ejecute diariamente a las 8PM, tendré que esperar hasta las 8PM para que la función se ejecute en mi máquina.

Entonces, mi pregunta es: ¿Cuál es la forma más simple y mejor de hacer que una función se ejecute una vez localmente?

Cosas que he probado o considerado:

  1. Use un cronograma más frecuente solo para el desarrollo local
    • Esto está bien, pero no es perfecto: todavía tiene que esperar un poco a menos que sea muy frecuente, y si es muy frecuente, la función puede ejecutarse varias veces. Esto es lo que estoy haciendo ahora.
  2. Escriba una aplicación de consola o una prueba de unidad que llame directamente al método Run() la función
    • Esto no es 100% sencillo porque tiene que proporcionar los argumentos TimerInfo y TraceWriter a Run() , y he encontrado sorprendentemente poca documentación para eso.

Las Estrategias de Microsoft para probar su código en la página de Funciones de Azure no son muy útiles en este tema, solo menciona los disparadores del temporizador como una forma de probar otros tipos de activadores.

En un mundo perfecto, presioné F5 y la función se ejecutaría de inmediato una vez, al igual que desarrollar una aplicación .NET "normal".


Tal vez podría usar el indicador RunOnStartup como se documenta here . No cumple con su resumen de que solo se ejecuta una vez, pero al menos debería ejecutarlo localmente una vez que la aplicación haya comenzado.

/// Gets or sets a value indicating whether the function should be invoked
/// immediately on startup. After the initial startup run, the function will
/// be run on schedule thereafter.

Ejemplo utilizando enlace de atributo:

[TimerTrigger("%TimerSchedule%", RunOnStartup = true)]TimerInfo myTimer


Tenía la misma pregunta. Lo arreglé con un Unittest. De hecho, debe apagar el TraceWriter y el TimerInfo.

Aquí algunos códigos de cómo hice esto.

TimerInfo:

public class ScheduleStub : TimerInfo
{
    public ScheduleStub(TimerSchedule schedule, ScheduleStatus status, bool isPastDue = false) : base(schedule, status, isPastDue)
    {
    }
}

Y el TraceWriter:

 public class TraceWriterStub : TraceWriter
{
    protected TraceLevel _level;
    protected List<TraceEvent> _traces;

    public TraceWriterStub(TraceLevel level) : base(level)
    {
        _level = level;
        _traces = new List<TraceEvent>();
    }

    public override void Trace(TraceEvent traceEvent)
    {
        _traces.Add(traceEvent);
    }

    public List<TraceEvent> Traces => _traces;
}