我对在特定时间仅检查一次的逻辑感到好奇

时间:2019-02-15 04:13:46

标签: c#

我需要帮助。

代码存在一些问题。 我想每天仅在特定时间进行一次检查。

尤其是在DateTime.Now.Hour == 11部分中,问题最严重。 我在某些时间检查有困难。我需要在whlie语句中编写只能在11:00进行一次检查的代码。

我创建了许可证文件,并检查了文件的日期。

public static CResult Dailytime(string date)
        {
            CResult result = new CResult();

            if(result.nRet == 0)
            {
                while (true)
                {
                    if (result.nRet == 1 || result.nRet == 2)
                    {
                        return result;
                    }

                    if (DateTime.Now.Hour == 11)
                    {
                        result = DailyCheckData(date);

                        if(result.nRet == 1 || result.nRet == 2)
                        {
                            return result;
                        }
                    }
                    System.Threading.Thread.Sleep(60 * 30 * 1000);
                }
            }
            return result;
        }

        public static CResult DailyCheckData(string data)
        {
            CResult result = new CResult();

            DateTime licenseDate = Convert.ToDateTime(data); 
            string dateNow = DateTime.Now.ToString("yyyy-MM-dd"); 

            int compareDate = DateTime.Compare(Convert.ToDateTime(data), DateTime.Now);

            if (licenseDate.ToString("yyyy-MM-dd") == dateNow)
            {
                result = ExpirationCertificate();
                Console.WriteLine("Result = " + result.Result + " Msg = " + result.Msg + " nRet = " + result.nRet);

                return result; 
            }
            else
            {
                if (compareDate > 0)
                {
                    result = TrueCertificate();
                    Console.WriteLine("Result = " + result.Result + " Msg = " + result.Msg + " nRet = " + result.nRet);

                }
                else if (compareDate <= 0)
                {

                    result = ExpirationCertificate();
                    Console.WriteLine("Result = " + result.Result + " Msg = " + result.Msg + " nRet = " + result.nRet);
                }
                return result;
            }
        }

CResult class
nRet= 0 or 1 or 2

0 = fasle date
1 = false file
2 = true

建议或提出改进方法。

3 个答案:

答案 0 :(得分:0)

您可以尝试在一行更改值的代码之后为DateTime.Now创建一个变量吗?

DateTime licenseDate = Convert.ToDateTime(data); 
string dateNow = DateTime.Now.ToString("yyyy-MM-dd"); 
int compareDate = DateTime.Compare(Convert.ToDateTime(data), DateTime.Now);

收件人

DateTime licenseDate = Convert.ToDateTime(data);
var now = DateTime.Now;
string dateNow = now.ToString("yyyy-MM-dd");
int compareDate = DateTime.Compare(licenseDate, now);

答案 1 :(得分:0)

您不应长时间使用Thread.Sleep()方法。使线程长时间睡眠的编程逻辑很差。

您可以做的是制造一个Timer。链接中附有示例。一个符合您的逻辑的简单代码段是:

licenseStart = //setYours
lastCheck = DateTime.Now;
nextCheck = now.AddDays(1); // now.AddHours(1)
var timer = new Timer(o=>{/* Do work*/}, null, TimeSpan.Zero, nextCheck);

希望有帮助!

答案 2 :(得分:0)

我询问了只能在11点循环一次的逻辑。 但是我找不到正确的答案,但找到了答案。

我英语说得不好。 这就是为什么其他人不理解问题的意图的原因。

bool bOnce = true;
        //bool s0nce = true;

while (true)
{
    if (DateTime.Now.Hour == 11  && bOnce)
    {
          //run code
    }
    if (bOnce == true)
        bOnce = false;
    else
        bOnce = true;
    Thread.Sleep(10 * 60 * 1000);
}