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

本文关键字:不知道 为什么 循环 计时器 我的 | 更新日期: 2023-09-27 18:21:23

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

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

周期性地,OnTimedEvent每秒只被调用一次,几乎完全是在大的时间跨度内。然后,它将恢复到每100毫秒一次。我无法准确地再现这些结果,有时会发生,有时不会。我观察过我的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调用。

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

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

至于提示,您可能想尝试在"OnTimedEvent"处理程序的开头添加逻辑,以防止再次进入,以防"OnTimedPEvent"处理过程花费的时间超过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--;
    }