使用Delay(TimeSpan)或Thread.Sleep在VMware中无法正常工作

问题描述 投票:1回答:1

我将问题简化为此示例:

[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上正常运行,但是在全新安装Windows 10的VMware Workstation Player 15上运行时,它会关闭并返回“延迟的操作”。没有错误。如果我将另一个Console.WriteLine放在开头,则以cmd显示。我分配给VMware 4核和6GB内存,关闭了cpu虚拟化,打开了3d加速。我是否缺少某些依赖项,或者VM需要不同的配置?

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

c# .net vmware vmware-player
1个回答
0
投票

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

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

  • 我确实有其他方法可以尝试。一个完全不依赖线程/异步和类似的延迟系统。某种原因可能会更健壮一些,以应对造成这种情况的原因。这种差异纯粹是偶然的-它以一个非常基本的速率限制系统为例进行了直播,该系统将在单独的线程中运行:

    整数间隔= 20;DateTime dueTime = DateTime.Now.AddMillisconds(interval);

  • while(true){if(DateTime.Now> = dueTime){//在此处插入代码

//Update next dueTime
dueTime = DateTime.Now.AddMillisconds(interval);

}其他{//只是屈服而不会使CPU负担Thread.Sleep(1);}}

此人仅将线程机制用于“空闲时CPU负载低”部分。其他所有内容都基于希望更稳定的DateTime系统。

请注意,短间隔的支持不佳,甚至20毫秒可能已经超出了限制。 DateTime.Now() is not remotely as accurate as as the type can be precise,因此仅适用于两位数或三位数间隔。延迟和睡眠实际上确实支持毫秒精度。

© www.soinside.com 2019 - 2024. All rights reserved.