.net - VB.net不一致的线程 sleep 定时器

标签 .net vb.net sleep thread-sleep

好吧,我一直在使用 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/

相关文章:

python time.sleep() 延迟以前的命令

Android - 如何唤醒 wifi?

java - 从 Java sleep OS X

c# - 为什么 ShowGridLines 这么慢?

asp.net - UpdatePanel中的按钮随机丢失事件处理程序

c# - 为什么在检查已上传到youtube处理状态的视频文件时,结果始终为空?

vb.net - 如何压缩vb.net 2.0中的文件夹及其子文件夹?

mysql - 如何在VB中打印Datagridview有表

javascript - 如何在与 PartialView A 交互时切换到 PartialView A 到 PartialView B?

c# - .NET 运行时尝试加载 FSharp.Core 4.3.0,即使所有项目都引用 4.3.1