2016-08-05 3 views
1

Я использую Azure WebJob для успешного получения сообщений из очереди служебных шин. Но я хотел использовать этот же WebJob для запуска некоторых методов каждые 5 секунд.Azure WebJob с очередями и System.Threading.Timer

Я пробовал следующий подход, и локально он работает нормально, но когда я публикую его, он запускается только один раз. Отсутствие ошибок в лазурных журналах.

Что я делаю неправильно?

Спасибо за помощь.

static void Main() 
    { 
     try 
     { 

    var testTimer = new System.Threading.Timer(e => TestMethod(), null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(5)); 

      SetupJobHost(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
    } 

    private static void TestMethod() 
    { 
     Console.WriteLine("Test"); 
    } 

ответ

0

Согласно вашему описанию, я проверил ваш код и воспроизвел на моей стороне.

После некоторых испытаний я обнаружил проблему с классом System.Threading.Timer, если мы не ссылаемся на экземпляр Timer после первоначального назначения, тогда он получит сбор мусора.

Пожалуйста, попробуйте ниже методов, чтобы увидеть, помогает ли это:

Метод 1: Развертывание webjob в режиме отладки без изменения кода;

Способ 2: Измените свой код следующим образом и разверните его в Azure в режиме деблокирования.

try 
{ 
    var testTimer = new System.Threading.Timer(e => TestMethod(), null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(5)); 
    SetupJobHost(); 
    testTimer.Dispose(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex); 
} 

Я рекомендую вам прочитать this article для лучшего понимания этого интересного вопроса. Кроме того, вы могли бы достичь своей цели, используя следующий код:

System.Timers.Timer sysTimer = new System.Timers.Timer(TimeSpan.FromSeconds(5).TotalMilliseconds); 
sysTimer.Elapsed += (s, e) =>TestMethod(); 
sysTimer.Enabled = true; 
1

я рекомендую другой подход и использование TimerTrigger. Вы можете использовать простое выражение chron, которое приведет к тому, что ваш метод будет выполнен по установленному расписанию. Если вы идете по этому маршруту, убедитесь, что вы развертываете свой WebJob в качестве запускаемого задания (не непрерывно!) И вызываете метод перед вызовом метода JobHost . Это гораздо более простой и понятный подход, чем запуск собственного таймера.