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,您可以尝试关闭它们。这将对性能不利,但可能会避免线程(管理器)和在稍有不同的时钟上启动操作系统的问题
- 我知道,我有一个不同的方法,你可以尝试。一个完全不依赖线程/异步和类似延迟系统的系统。一些可能稍微更强大的东西,对抗任何导致这种情况的因素。这种差异纯属偶然——它以一个非常基本的限速系统为例,在一个单独的线程中运行:
请注意,短间隔的支持较差,即使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);
}
}