【发布时间】:2012-01-11 00:42:58
【问题描述】:
我正在开发一个控制台应用程序,它将按设定的时间间隔安排和运行,比如每 30 分钟一次。它的唯一目的是查询 Web 服务以更新一批数据库行。
Web 服务 API 建议每 30 秒调用一次,并在设定的时间间隔后超时。下面以伪代码为例:
listId := updateList(<list of terms>)
LOOP
WHILE NOT isUpdatingComplete(listId)
END LOOP
statuses := getStatuses(“LIST_ID = {listId}”)
我在 C# 中大致将其编码为:
int callCount = 0;
while( callCount < 5 && !client.isUpdateComplete(listId, out messages) )
{
listId = client.updateList(options, terms, out messages);
callCount++;
Thread.Sleep(30000);
}
// Get resulting status...
在这种情况下可以使用 Thread.Sleep() 吗?我知道这通常不是好的做法,但从阅读不使用它的原因来看,这似乎是可以接受的用法。
谢谢。
【问题讨论】:
-
您对
Thread.Sleep的使用完全可以接受 -
控制台应用程序会被调度吗?如果是这样,为什么不把它安排为每 30 分钟一次呢?更好的解决方案是使用计时器调用方法的 Windows 服务。
-
为什么不呢?不使用的原因是什么?
-
@Ray:看起来这个特定的代码只需要 2.5 分钟即可运行(5 个循环,迭代之间等待 30 秒)。听起来这些循环计划每 30 分钟执行一次。换句话说,循环不会坐 30 分钟..
-
@Ray 我认为控制台应用程序计划每 30 分钟运行一次与 Web 服务的 API 建议调用者每隔 30 秒进行一次重试尝试之间存在混淆。在这种情况下,看起来 Thread.Sleep 被用于间隔重试,而不是作为调度控制台应用程序工作的机制。控制台应用程序每 30 分钟运行一次这一事实与此无关。