设置Thread.Sleep(TimeSpan)的高值

3

我希望在我的应用程序中有一个线程执行任务后睡眠一段特定的时间。我使用Thread.Sleep(),并将TimeSpan值作为参数。这个方法运行良好。但是当我设置一个较大的值,比如25.20:30:40(25天20小时20分钟40秒),它会抛出ArgumentOutOfRangeException异常。

http://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx

异常情况

参数超出范围 当timeout的值为负数且不等于以毫秒为单位的Timeout.Infinite,或者大于Int32.MaxValue毫秒。

休眠时间的值从配置文件中读取。在测试期间,测试人员将此值设置为上述高值。我感兴趣的是知道使我的线程在指定的时间内不执行任何操作的更好方法。(即使它太高了。)


2
25.20:30:40 是什么? - Rotem
1
正如MSDN所述,它不能超过Int32.MaxValue毫秒,而2147483647大约是24天20小时左右。但是您确定您的程序会运行那么长时间吗? - Konrad Kokosa
如果您设置的睡眠时间大于int.maxval,那么您确定您实际需要的是睡眠吗?那是很长的时间。 - Paul Michaels
我的线程理想的睡眠时间是10分钟。在生产环境中,我们希望线程休眠几天,直到我们解决问题。因此,我尝试测试更高范围的值。 - Shetty
3
有兴趣知道,你遇到什么问题需要“让线程睡眠数天”来解决? - Paul Michaels
显示剩余5条评论
4个回答

13

文档告诉您最长时间跨度:

TimeSpan maxSleepSpan = TimeSpan.FromMilliseconds(int.MaxValue);

这是24.20:31:23.6470000。如果您需要更长的睡眠时间,那么您需要重新考虑您的设计。


3
实际上,即使睡眠10分钟,重新思考设计也是适当的...这是调度器的工作,而不是"Thread.Sleep" :D - Luaan
2
@Luaan - 是的,我同意,通常调用Sleep是一个错误。 - Lee
@Luaan,@Lee:我们有一个现有的Windows服务,其中有一个线程执行此任务。这不是一个新设计 :) - Shetty
我同意这一点,在这种情况下,它应该/可以创建为定期任务。 - Shetty

4
错误信息已经给出了答案 - Int32.MaxValue 毫秒。Int32.MaxValue 是2147483647,即24.20:31:23(24天20小时)。
如果您正在尝试等待这么长时间,那么您不应该使用 Thread.Sleep - 首先,这意味着您为每个活动作业都绑定了一个线程。我建议您考虑使用调度库,例如Quartz.NET。这将允许您在特定时间或时间间隔内安排作业运行。

2

我有点不理解,您已经回答了自己的问题:

超时值为负数,并且不等于Timeout.Infinite以毫秒为单位,或者大于Int32.MaxValue毫秒。

TimeSpan值不能为负数、无限大,也不能大于2147483647毫秒(Int32.MaxValue)


1

你可以设置的最大值是2,147,483,647,因为MSDN已经说明了

它不能大于Int32.MaxVaue


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接