我的计时器循环间歇性地减慢,不知道为什么

时间:2015-11-11 02:49:01

标签: c# loops timer

我有一个使用System.Timers.Timer循环的API请求队列。我这样设置:

    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调用。

1 个答案:

答案 0 :(得分:0)

首先,当你说你有一个循环时,我不太清楚。你的&#34; OnTimedEvent&#34;是一个以预设间隔(100毫秒)触发的事件处理程序。

至于提示,您可能想尝试在&#34; OnTimedEvent&#34;的开头添加逻辑。处理程序,以防止重新进入,只是在你的&#34; OnTimedEvent&#34;处理程序耗时超过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--;
    }