我希望我的应用程序中的一个线程执行一个任务,并在那个睡眠后持续一段特定的时间。我使用Thread.Sleep()
和TimeSpan
值作为参数。它工作正常。但是当我设置一个很大的值,例如25.20:30:40(25天20小时20分40秒)时,它会抛出一个ArgumentOutOfRangeException
。
http://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx
例外情况
ArgumentOutOfRangeException timeout的值为负且不等于Timeout.Infinite(以毫秒为单位),或者大于Int32.MaxValue毫秒。
从配置文件中读取睡眠时间的值。在测试时,测试人员将此值设置为如上所述的高值。我感兴趣的是要知道在我提到的时间内让我的线程不做任何事情的更好方法是什么。 (即使它太高了。)
文档告诉您最大时间跨度:
TimeSpan maxSleepSpan = TimeSpan.FromMilliseconds(int.MaxValue);
这是24.20:31:23.6470000
。如果你需要睡得更久,那么你需要重新考虑你的设计。
错误消息为您提供了这个答案 - Int32.MaxValue毫秒。 Int32.MaxValue是2147483647,其是24.20:31:23(24天20小时)。
如果您正在尝试等待这段时间,那么您不应该使用Thread.Sleep - 一开始这意味着您已经为每个活动作业绑定了一个线程。我建议调查Quartz.NET这样的调度库。这将允许您安排作业在特定时间或时间间隔运行。
我错过了什么吗?你是在自问自答:
timeout的值为负,不等于Timeout.Infinite(以毫秒为单位),或者大于Int32.MaxValue毫秒。
TimeSpan值不能为负,无限或大于2147483647 ms(Int32.MaxValue)
您可以设置的最大价值是2,147,483,647
,因为MSDN已经说明了这一点
它不能大于Int32.MaxVaue