2015-11-11 43 views
0

我有一個API請求隊列,我已使用System.Timers.Timer循環。我把它像這樣:我的計時器循環間歇性地減慢,不知道爲什麼

private static void SetupTimerLoop() 
    { 
     queueLoopTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     queueLoopTimer.Interval = 100; 
     queueLoopTimer.Start(); 
    } 

定期OnTimedEvent只會被稱爲每秒一次,幾乎一模一樣的時間跨度大。然後它會每100ms加速一次。我無法準確地重現這些結果,有時會發生,有時卻不會。我觀察過我的CPU使用情況,並且在這些放緩的時候,它並沒有飆升,如果有什麼降低的話。

如果我做斷點它表明定時器間隔仍然只有100ms。

這裏可能會發生什麼?有什麼我可以做的,以進一步解決這個問題?

潛在相關,當發生這種情況時,所有從循環中啓動的HTTP請求(這些放在任務中,以便它們異步返回)不再返回。相關

請求:

private T Get<T>(string endpoint, IRequest request) where T : class 
    { 
     var client = InitHttpClient(); 

     string debug = BaseUrl + endpoint + ToQueryString(request); 

     HttpResponseMessage response = client.GetAsync(BaseUrl + endpoint + ToQueryString(request)).Result; 
     string body = response.Content.ReadAsStringAsync().Result; 

     if (response.IsSuccessStatusCode) 
     { 
      T result = JsonConvert.DeserializeObject<T>(body, _serializerSettings); 

      return result; 
     } 

     var error = JsonConvert.DeserializeObject<HelpScoutError>(body); 
     throw new HelpScoutApiException(error, body);                 
    } 

我從來沒有:string body = response.Content.ReadAsStringAsync().Result;只要循環似乎運行緩慢。

不知道如果這可能與它有關,希望你們有一些洞察力。

編輯:我不淹沒與請求的API。我扼殺了每60秒滾動一次的請求數量。在那段時間,我只是使用if語句來傳遞該循環的API調用。

回答

0

首先,當你說你有一個循環時,我不太清楚。您的「OnTimedEvent」是一個事件處理程序,它以預設間隔(100毫秒)觸發。

至於提示,你可能想嘗試在你的「OnTimedEvent」處理程序的開始處添加邏輯以防止重新進入,以防萬一你的「OnTimedEvent」處理程序花費的時間超過100ms。

static int working = 0; 
    private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e) 
    { 
     if (working > 0) 
      return; 

     working++; 

     //do your normal work here 

     working--; 
    } 
+0

嗨YooManFoo,它肯定是一個事件處理程序,以預設的時間間隔觸發。然而,我很困惑,爲什麼它有時不會在適當的時候觸發。感謝您的建議,我已經實施了。 –

+0

您可能想在此處添加更多代碼段,以便我們可以嘗試一下,如果您仍然遇到問題。 – YooManFoo

相關問題