【问题标题】:Using Delay(TimeSpan) or Thread.Sleep doesn’t properly work in VMware在 VMware 中使用 Delay(TimeSpan) 或 Thread.Sleep 无法正常工作
【发布时间】:2020-02-03 01:45:25
【问题描述】:

我将我的问题简化为这个例子:

[STAThread]
static void Main() {
   var t = Task.Run(async delegate {
      await Task.Delay(TimeSpan.FromSeconds(5));
      return "delayed action";
   });

   t.Wait();
   Console.WriteLine("Task t Status: {0}, Result: {1}", t.Status, t.Result);
}

虽然这在我的主机 PC 上表现正常,但当在 VMware Workstation Player 15 上运行并安装全新的 Windows 10 时,它会在返回“延迟操作”之前关闭。没有错误。如果我在开头放置另一个 Console.WriteLine,它会显示在 cmd 中。 我分配给 VMware 4 核和 6GB 内存,关闭 cpu 虚拟化,打开 3d 加速。我是否缺少一些依赖项,或者 VM 需要不同的配置?

我的目标是创建一系列需要随时间传播的SendInput 函数。我什至尝试了一个带有延迟选项的第 3 方“点击器”工具,它也有同样的问题。我必须将其设置为 30 毫秒才能获得 500 毫秒的点击次数,就好像大部分点击次数从未注册过一样。对我的代码执行相同操作在 VM 上不起作用,但在主机 PC 上可以正常工作。

【问题讨论】:

  • 它是“关闭而不显示”还是“不延迟预期的持续时间”?程序是从终端(保持打开状态)运行还是通过在资源管理器中双击运行? tldr:在末尾添加一个 Console.ReadLine 并显示启动+等待任务所需的时间,并酌情重新评估和澄清问题。
  • 我通过单击运行可执行文件,然后首先通过终端导航到它的位置。终端关闭时两次都没有显示任何内容,就好像它认为代码已运行完成一样。编辑:将修改我的代码示例以包含更多控制台日志和时间戳。
  • 从命令行终端运行它不会关闭..这将消除一个潜在的混乱来源。
  • 我将结束这个问题,因为事实证明问题不在于线程,但程序需要首先获得 6-7 个输入,然后在所有后续输入上形成无论数量多少都可以正常工作,真的很奇怪,不知道为什么会这样。感谢您的阅读和评论。

标签: c# .net vmware vmware-player


【解决方案1】:

很遗憾,除了两个想法之外,我无法帮助您修复 VMWare 端:

  • 如果有任何东西通过线程直接传递到主机 CPU,您可以尝试关闭它们。这对性能不利,但可以避免线程(管理器)和启动操作系统在稍微不同的时钟上运行的问题。

  • 我有一个不同的方法你可以尝试。对线程/异步和类似延迟系统的依赖要少得多。对于导致这种情况的任何原因,可能会稍微更健壮一些。这种差异纯粹是偶然的——它开始作为一个非常基本的速率限制系统的示例,在单独的线程中运行:

    integer interval = 20;
    DateTime dueTime = DateTime.Now.AddMillisconds(interval);
    
    while(true){
      if(DateTime.Now >= dueTime){
        //insert code here
    
        //Update next dueTime
        dueTime = DateTime.Now.AddMillisconds(interval);
      }
      else{
        //Just yield to not tax out the CPU
        Thread.Sleep(1);
      }
    }

这个只使用线程机制来处理“空闲时的低 CPU 负载”部分。其他一切都基于希望更稳定的 DateTime 系统。

请注意,对短间隔的支持很差,即使 20 毫秒也可能已经超出限制。 DateTime.Now() is not remotely as accurate as as the type can be precise,因此它仅远程适用于双位数或三位数的间隔。 Delay 和 Sleep 实际上支持毫秒精度。

【讨论】:

  • 我将结束这个问题,因为事实证明问题不在线程中,而是程序首先需要获得 6-7 个输入,然后从那时起,无论数量多少,所有后续输入都可以正常工作,真的很奇怪,不知道为什么会这样。感谢您的阅读和评论。
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 2018-06-30
  • 1970-01-01
相关资源
最近更新 更多