2016-08-05 46 views
1

我正在使用Azure WebJob從服務總線隊列中成功獲取消息。 但我想用這個相同的WebJob每5秒運行一些方法。具有隊列和System.Threading.Timer的Azure WebJob

我試過了以下方法,本地運行良好,但是當我發佈它時只運行一次。 天藍色日誌上沒有錯誤。

我在做什麼錯了?

感謝您的幫助。

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部署爲觸發作業(不連續!),並且在調用JobHostRunAndBlock方法之前調用JobHostConfigurationUseTimers()方法。這比滾動您自己的計時器服務更容易,更清潔。

相關問題