可接受使用Thread.Sleep()

Ton*_*onE 8 c# sleep

我正在研究一个控制台应用程序,它将按照设定的时间间隔进行安排和运行,比如说每30分钟一次.其唯一目的是查询Web服务以更新一批数据库行.

Web Service API重新命令每30秒调用一次,并在设置的间隔后超时.以下伪代码作为示例给出:

listId := updateList(<list of terms>)
LOOP
  WHILE NOT isUpdatingComplete(listId)
END LOOP
statuses := getStatuses(“LIST_ID = {listId}”)
Run Code Online (Sandbox Code Playgroud)

我在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...
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用Thread.Sleep()可以吗?我知道这通常不是好的做法,但从阅读理由不使用它看起来似乎是可接受的用法.

谢谢.

Kie*_*one 6

Thread.Sleep确保当前线程至少在指定的毫秒数后才返回.有很多地方适合这样做,你的例子看起来很好,假设它在后台线程上运行.

一些示例您不想使用它 - 在UI线程上或您需要精确计时的位置.

  • 我认为您的资格"假设它在后台线程上运行"是可以的,但在这种情况下,应用程序似乎是一个控制台应用程序,它将作为计划任务自动运行,所以我认为在这种情况下,没有必要确保它运行在后台线程上.如果这是一个交互式应用程序,那么我完全同意您的资格. (3认同)

Jon*_*Jon 5

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

在你的情况下,程序是单线程的,它没有UI(即线程没有消息循环),你不想与外部事件同步.因此Thread.Sleep很好.