好吧,我一直在使用 VB.net 并集思广益,以实现每 60 秒可靠地启动一个线程,而不管前一个线程需要多长时间才能完成工作。这是我的问题。给出以下代码:
Dim intTemp As Integer
intTemp = 2
Do While intTemp > 1
Dim objWriter As New System.IO.StreamWriter("C:\Documents\Visual Studio 2010\Projects\Report\Report\Stream.txt", True)
intTemp = intTemp + 1
System.Threading.Thread.Sleep(5000)
objWriter.Write(intTemp & " " & Date.Now & " " & Date.Now.Millisecond & vbCrLf)
objWriter.Close()
Loop
在stream.txt 文件中生成此内容。
3 4/5/2011 9:41:27 AM 807
4 4/5/2011 9:41:32 AM 812
5 4/5/2011 9:41:37 AM 817
6 4/5/2011 9:41:42 AM 822
7 4/5/2011 9:41:47 AM 826
8 4/5/2011 9:41:52 AM 831
9 4/5/2011 9:41:57 AM 836
10 4/5/2011 9:42:02 AM 841
11 4/5/2011 9:42:07 AM 799
我对此输出的假设是,每行之间的时间必须恰好为 5000 毫秒加上执行循环其余部分所需的时间,考虑到磁盘 IO 可能会出现未知的延迟,该时间可能会有所不同。我的问题是,查看第 10 行和第 11 行并减去,结果相差 4,958 毫秒。所以我的问题是到底发生了什么?当我告诉线程在完成该过程之前休眠 5000 毫秒时,如何才能获得小于 5000 毫秒的差异。我错过了什么?
最佳答案
首先,请了解所有主要操作系统,尤其是具有多任务功能的操作系统,永远无法将计时器降到毫秒级。该架构根本不支持它。
其次,考虑到会有一些延迟,如果底层框架、操作系统和其他涉及的任何内容设置了 5000 毫秒,您的代码将永远触发5000 毫秒,之后总是 x 毫秒。您观察到的情况很可能是操作系统保留了一些关于平均延迟的记录,并相应地调整了超时值,以尝试使平均延迟接近 5000 毫秒。
您可以阅读 real time operating systems获取更多信息。
关于.net - VB.net不一致的线程 sleep 定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5557817/