可以';t在C#中的匹配次数
本文关键字:可以 | 更新日期: 2023-09-27 17:57:33
我有一个用C#编写的非常简单的程序,但循环永远不会退出,因为时间不匹配。
static void Main(string[] args)
{
while (System.DateTime.Now != new System.DateTime(2011, 05, 23, 22, 17, 0))
{
}
System.Diagnostics.Process.Start(file);
}
其想法是,当时间计时到指定的时间时,给定的文件就会启动。然而,我已经用一些值测试了这个程序,例如,只比Windows报告的当前时间提前了一分钟,它不会启动这个过程。我已验证Process.Start
调用是否正确。有什么建议吗?
编辑:不,这不是一个实验或任何类似的东西。这是因为我在睡觉时一直关掉闹钟。file
是一个mp3文件,我要把扬声器开着,我很确定我在睡觉时没有能力处理它。我用程序解决的第一个实际问题。由于它有一个相当具体的目的,我想你会同意另一个解决方案的必要性是有限的。
编辑:我没有意识到DateTime类型会下降到那种精度,否则我自己就会发现这一点。我认为它们只在一秒钟内有效,而且由于循环即使在IDE中的调试模式下也应该每秒运行很多次,我不明白为什么完全匹配是不合理的。但是,当然,如果你把它比作100纳秒,这是非常不可能的。
您应该执行
static void Main(string[] args)
{
while (System.DateTime.Now < new System.DateTime(2011, 05, 23, 22, 17, 0))
{
}
System.Diagnostics.Process.Start(file);
}
因为如果你不勾选确切的时间,它就永远不会退出
编辑原因的详细解释!=很可能不会起作用所以实际上你可以这样写代码:
static void Main(string[] args)
{
DateTime fireDate = new DateTime(2011, 05, 23, 22, 17, 0);
while (System.DateTime.Now < fireDate)
{
}
System.Diagnostics.Process.Start(file);
}
正如Ben Voigt所指出的,DateTime
比较着眼于DateTime
DateTime上的Ticks
属性。是毫秒的1/10,000
。
您的循环可能不会那么频繁地执行。
为什么不使用睡眠或创建计时器?
使用<
而不是!=
。
无论如何,这是一种可怕的等待特定时间的方式。
使用<
而不是!=
。
我会将其切换为
while (System.DateTime.Now < new System.DateTime(2011, 05, 23, 22, 17, 0))
{
}
相反。尽管我也会非常谨慎地使用这样的闭环,并认为设置一个预定的任务或其他事情会更有效。
将其更改为用户小于运算符我有点惊讶它以秒为单位错过了时间,b但使用时间相等通常是危险的,因为这是非常精确的原因(基于Ticks
的相等)。
System.DateTime.Now < otherDateTime
需要注意的是,这种类型的"繁忙等待"对处理器来说是极其浪费的。正如其他人所指出的,使用计时器,或者至少让线程休眠,这样处理器就可以用它的时间做其他事情。