Thread.Sleep()的可接受使用

本文关键字:可接受 Sleep Thread | 更新日期: 2023-09-27 18:19:51

我正在开发一个控制台应用程序,该应用程序将按设定的时间间隔(比如每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()的可接受使用

Thread.Sleep确保当前线程不会返回,直到至少经过指定的毫秒。有很多地方适合这样做,假设它在后台线程上运行,那么您的示例似乎很好。

一些你不想使用它的地方——在UI线程上,或者你需要精确计时的地方。

一般来说,Thread.Sleep与任何其他工具一样:完全可以使用,除非它被严重滥用。我不同意"一般不好的实践"部分,这是人们在应该做其他事情(即阻塞同步对象)时滥用Thread.Sleep的结果。

在您的情况下,程序是单线程的,它没有UI(即线程没有消息循环),并且您不希望与外部事件同步。因此CCD_ 4是合适的。

对Sleep()的普遍反对意见是它浪费了一个线程。

在您的情况下,只有1个线程(可能是2个),所以这并不是一个真正的问题。

所以我觉得它看起来不错(但我会睡29秒来放松一下)。

这很好,只是一旦它进入睡眠状态,你就不能在不中止线程的情况下中断它(这是不推荐的)。

这就是为什么ManualResetEvent可能是一个更好的主意,因为它可以从不同的线程发出信号("唤醒")。

您可以使用Thread.Sleep方法。但将它安排为每30分钟运行一次会更优雅,这样您就不必在应用程序中等待了。

Thread.Sleep不是执行周期性逻辑的最佳方法。Thread.Sleep(n)表示线程将在n毫秒内放弃控制。不能保证它会在n毫秒后重新获得控制,这取决于CPU负载。

如果您要锁定线程30分钟,那么您应该每30分钟安排一次windows任务,这样程序就会执行并结束。这样你就不会把一个线程锁定这么长时间。

对于较短的时间,如30秒/1分钟,System.Thread.Sleep()非常好。在超过5分钟的时间里,我会使用windows任务。(我是西班牙语,我想在英文版上是这样称呼的,我说的是你在控制面板上安排的任务;-)