C# - 在控制台应用程序中精确使用Thread.Sleep

3
我是一名学习C#的初学者,想在控制台窗口中创建一个基于文本的贪吃蛇游戏。目前,游戏运行得相当不错,但我遇到了一个问题,就是使用Thread.Sleep()方法来暂停代码执行一定毫秒数的时间时,实际暂停的时间总是比指定的时间长几毫秒。对于一个贪吃蛇游戏而言,这是一个相当大的问题。
我尝试过的解决办法:
while (true)
            {
                double startingTime = DateTime.Now.TimeOfDay.Milliseconds;
                //code
                double lag = DateTime.Now.TimeOfDay.Milliseconds - startingTime;
                Thread.Sleep((int)Math.Round(25 - lag));
                double finalTime = DateTime.Now.TimeOfDay.Milliseconds - startingTime;
                Console.Title = string.Format("Time: {0}", finalTime);
            }

我知道代码运行需要大约6毫秒的时间,所以我尝试测量并从每次移动之间应该等待的时间中减去它。有时候它可以正常工作,但更多的情况下控制台标题会显示花费了31毫秒...
我真的很感激任何建议,如果你知道一个更好的方法来暂停代码运行,以精确的时间为单位,我会很高兴知道 :)
解决方案:最终我使用了一个秒表,就像Tamir建议的那样,谢谢所有帮助我的人:D

尝试使用System.Threading.Timer而不是Thread.Sleep,因为它的开销在你的情况下可能会有所不同。详情请参见此处 - https://dev59.com/hHRC5IYBdhLWcg3wKtv2 - Stepan Novikov
3
即使是计时器,也不可能在几毫秒内精确到特定的程度,尤其是针对如此短的时间段。 - Servy
5
如果你想从事游戏开发,最好使用专业的游戏开发框架/引擎。如果不这样做,你就必须自己构建基本的框架(如游戏循环等)。 - Servy
你正在错误地测量延迟,因为你将开始时间测得太晚。开始时间应该是定时器设置为触发的时间,而不是你的代码获得控制的时间。所以,如果你设置定时器在30毫秒后触发,那么开始时间应该是现在加上30毫秒,而不是你回过头来访问DateTime.Now的时间。如果你想每小时做一些事情,你需要等到每个小时相同分钟的时候开始任务。 - David Schwartz
@NadavFreedman 随着时间的推移,你会遇到越来越多的问题,修复它们会变得越来越困难。越早转向正确的编程范式,就会越容易解决问题,也不会养成需要重新学习的坏习惯。 - Servy
显示剩余3条评论
1个回答

4

对于非常精确的计时,您应该使用多媒体计时器。 接下来最好的选择是 Stopwatch。


谢谢,我一定会去看看的。 - Nadav Freedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接