Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用延迟(TimeSpan)或线程。睡眠不会’;无法在VMware中正常工作_C#_.net_Vmware_Vmware Player - Fatal编程技术网

C# 使用延迟(TimeSpan)或线程。睡眠不会’;无法在VMware中正常工作

C# 使用延迟(TimeSpan)或线程。睡眠不会’;无法在VMware中正常工作,c#,.net,vmware,vmware-player,C#,.net,Vmware,Vmware Player,我将问题归结为以下示例: [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,

我将问题归结为以下示例:

[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
函数。我甚至尝试了一个第三方的“点击器”工具,它有一个延迟选项,它也有同样的问题。我必须将其设置为30毫秒才能获得500毫秒的点击,就好像大部分点击从未注册过一样。对我的代码执行同样的操作在VM上不起作用,但在主机PC上可以正常工作。

很遗憾,除了两个不太合适的想法外,我无法帮助您修复VMWare端:

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

  • 我知道,我有一个不同的方法,你可以尝试。一个完全不依赖线程/异步和类似延迟系统的系统。一些可能稍微更强大的东西,对抗任何导致这种情况的因素。这种差异纯属偶然——它以一个非常基本的限速系统为例,在一个单独的线程中运行:

这一部分仅对“空闲时低CPU负载”部分使用线程机制。其他一切都基于希望更稳定的日期时间系统


请注意,短间隔的支持较差,即使20毫秒也可能已经超出限制,所以它只能远程工作于双位或三位数字间隔。延迟和睡眠实际上支持毫秒精度。

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