2015-11-11 5 views
0

У меня есть очередь запросов API, которую я зациклил, используя System.Timers.Timer. Я поставил его так:Мой таймер петли прерывается, не уверен, почему

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

Периодически OnTimedEvent только дозвонились один раз в секунду, почти точно для больших промежутков времени. Затем он будет восстанавливаться до одного раза каждые 100 мс. Я не могу точно воспроизвести эти результаты, иногда это происходит, иногда это не так. Я наблюдал за использованием моего процессора, и он не всплескивался в течение этих периодов замедления, если что-то сходит с ума.

Если я делаю контрольные точки, это показывает, что интервал таймеров по-прежнему равен только 100 мс.

Что может быть здесь? Есть ли что-нибудь, что я могу сделать для дальнейшего устранения этой проблемы?

Потенциально связанный, когда это происходит со всеми моими 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» занимает больше 100 мс.

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

Hi YooManFoo, это определенно обработчик событий, который запускается с заданным интервалом. Тем не менее, я очень смущен, почему он иногда не срабатывает в соответствующее время. Спасибо за ваше предложение, я это сделал. –

+0

Возможно, вы захотите добавить здесь фрагмент кода, чтобы мы могли попробовать, если у вас все еще есть проблемы. – YooManFoo

Смежные вопросы