我有一个使用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调用。
答案 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--;
}