我有一个简单的(愚蠢的)代码,我用它来测试我们的错误记录机制。它试图从不存在的文件中读取。例外,我设置了DateTime值,然后我有一个while循环。一旦当前DateTime等于我设置的DateTime值,那么我将异常传递给我的错误记录项目。
此代码在按下按钮时开始。这样做的目的是我可以测试在ASP.NET应用程序中从单独的用户会话中抛出多个异常时会发生什么。
所以我打开几个浏览器会话,按'Exception'按钮然后这个代码就会运行。一旦当前时间与我设置的时间匹配,那么它应抛出异常,但if(DateTime.Now == run)
永远不会评估为真。为什么?
protected void Button1_Click(object sender, EventArgs e)
{
try
{
string text = System.IO.File.ReadAllText(@"C:\test.txt");
}
catch (FileNotFoundException ex)
{
DateTime run = new DateTime(2013, 12, 18, 14, 0, 0);
bool hasRun = false;
while (hasRun == false)
{
if (DateTime.Now == run)
{
ErrorLogger errorLogger = new ErrorLogger(ex);
hasRun = true;
}
}
}
}
答案 0 :(得分:1)
if(DateTime.Now> = run)
与使用float或double检查相等性时类似的陷阱
答案 1 :(得分:1)
我认为你只是没有考虑到时间永远不会四舍五入到秒。总有几秒钟。如果您想比较,只需使用此代码段
var date = DateTime.Now;
date = new DateTime(date.Year,date.Month,date.Day,date.Hour,date.Minute,date.Second)
if (date == run)
{
答案 2 :(得分:1)
使用Timer
可以获得更清晰,风险更低的代码(没有可能无限的循环):
catch(FileNotFoundException ex)
{
// The hard-coded date should of course be a *future* one for the code to have sense
var interval = new DateTime(2013, 12, 20, 09, 00, 00) - DateTime.Now;
Timer t = new Timer(interval.TotalMilliseconds);
t.Elapsed += (s, e) =>
{
ErrorLogger errorLogger = new ErrorLogger(ex);
t.Stop(); // Let it only run once
};
t.Start();
}
答案 3 :(得分:0)
尝试使用if条件:
if (Datetime.Now.Subtract(run).Days == 0)
{
// code goes here if the run and Datetime.Now are on the same day
}