Как сделать лазурный webjob работать непрерывно и вызвать публичную статическую функцию без автоматического запуска

Я разрабатываю лазурный webjob, который должен работать непрерывно. У меня есть статическая функция. Я хочу, чтобы эта функция автоматически запускалась без какой-либо очереди. Сейчас я использую while (true) для непрерывного запуска. Есть ли другой способ сделать это?

Пожалуйста, найдите ниже мой код

   static void Main()
    {
        var host = new JobHost();
        host.Call(typeof(Functions).GetMethod("ProcessMethod"));
        // The following code ensures that the WebJob will be running continuously
        host.RunAndBlock();
    }

[NoAutomaticTriggerAttribute]
public static void ProcessMethod(TextWriter log)
{
    while (true)
    {
        try
        {
            log.WriteLine("There are {0} pending requests", pendings.Count);
        }
        catch (Exception ex)
        {
            log.WriteLine("Error occurred in processing pending altapay requests. Error : {0}", ex.Message);
        }
        Thread.Sleep(TimeSpan.FromMinutes(3));
    }
}

Спасибо

Ответы

Ответ 1

Эти шаги помогут вам в том, что вы хотите:

  • Измените свой метод на async
  • ожидание сна
  • используйте host.CallAsync() вместо host.Call()

Я преобразовал ваш код, чтобы отобразить следующие шаги.

static void Main()
{
    var host = new JobHost();
    host.CallAsync(typeof(Functions).GetMethod("ProcessMethod"));
    // The following code ensures that the WebJob will be running continuously
    host.RunAndBlock();
}

[NoAutomaticTriggerAttribute]
public static async Task ProcessMethod(TextWriter log)
{
    while (true)
    {
        try
        {
            log.WriteLine("There are {0} pending requests", pendings.Count);
        }
        catch (Exception ex)
        {
            log.WriteLine("Error occurred in processing pending altapay requests. Error : {0}", ex.Message);
        }
        await Task.Delay(TimeSpan.FromMinutes(3));
    }
}

Ответ 2

Используйте Microsoft.Azure.WebJobs.Extensions.Timers, см. https://github.com/Azure/azure-webjobs-sdk-extensions/blob/master/src/ExtensionsSample/Samples/TimerSamples.cs, чтобы создать триггер, который использует инструкцию TimeSpan или Crontab для выполните пожарный метод.

Добавьте Microsoft.Azure.WebJobs.Extensions.Timers из NuGet в ваш проект.

public static void ProcessMethod(TextWriter log)

становится

public static void ProcessMethod([TimerTrigger("00:05:00",RunOnStartup = true)] TimerInfo timerInfo, TextWriter log) 

для пятиминутных триггеров (с использованием строки TimeSpan)

Вам понадобится обеспечить, чтобы ваш Program.cs Main настраивал конфигурацию для использования таймеров следующим образом:

static void Main()
    {
        JobHostConfiguration config = new JobHostConfiguration();
        config.UseTimers();

        var host = new JobHost(config);

        // The following code ensures that the WebJob will be running continuously
        host.RunAndBlock();
    }