Выход из цикла while, в то время как условия ложные - PullRequest
0 голосов
/ 11 июня 2019

Я вижу, что это не ожидание в указанное время.

Я пытался выучить c # и пока точно не знаю, что такое весь синтаксис.Я просто хочу знать, есть ли более эффективные способы выполнения этой задачи.

while (DateTime.Now.DayOfWeek == DayOfWeek.Saturday 
    && DateTime.Now.DayOfWeek == DayOfWeek.Sunday 
    && DateTime.Now.Hour <=8 
    && DateTime.Now.Hour >=18  
    && DateTime.Now.Minute <=9)
{
    Random waitTime = new Random();
    int milliseconds = waitTime.Next(120000, 180000);
    System.Threading.Thread.Sleep(milliseconds);
}

Я хочу, чтобы он дождался субботы или воскресенья, если это было до 08:00, после 18:00 или впервые десять минут каждого часа.

Проблема в том, что я видел выход из цикла в 19:05 в понедельник, что является двумя условиями.Правильно ли я использую функцию && или мне нужно заменить ее чем-то другим?

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Джон прав, это не может быть и суббота, и воскресенье.Вот как должен выглядеть ваш код

            Random myRand = new Random();
        bool isSatOrSun = DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
        bool isNotBetween8And1800 = DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18;
        bool isFirstTenMinutes = DateTime.Now.Minute <= 9;

        //if you want to do Between 8 & 18 on Saturday/Sundays OR first 10 minutes of each hour on Saturday/Sunday

        while(isSatOrSun && (isNotBetween8And1800 || isFirstTenMinutes))
        {
            //do your sleep
            int waitTime = myRand.Next(120000, 180000);
            System.Threading.Thread.Sleep(waitTime);

            //now recheck your variables
            isSatOrSun = DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
            isNotBetween8And1800 = DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18;
            isFirstTenMinutes = DateTime.Now.Minute <= 9;
        }


        //if you want to do all day on Saturday/Sundays OR Between 8 & 18 any day of the week OR  first 10 minutes of each hour any day of the week

        while (isSatOrSun || isNotBetween8And1800 || isFirstTenMinutes)
        {
            //do your sleep
            int waitTime = myRand.Next(120000, 180000);
            System.Threading.Thread.Sleep(waitTime);

            //now recheck your variables
            isSatOrSun = DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
            isNotBetween8And1800 = DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18;
            isFirstTenMinutes = DateTime.Now.Minute <= 9;
        }
0 голосов
/ 11 июня 2019

Из того, что я узнал за последние 20 минут, похоже, что это приостановится, если будет выполнено любое из следующих условий;Это воскресенье, это суббота, Это раньше, чем 0800, Это позже, чем 1800, Минута меньше, чем 10

Random waitTime = new Random();
while (DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday || DateTime.Now.Hour <=8 || DateTime.Now.Hour >=18  || DateTime.Now.Minute <=9)
{
int milliseconds = waitTime.Next(120000, 180000);
System.Threading.Thread.Sleep(milliseconds);
}
0 голосов
/ 11 июня 2019

Поскольку вы учитесь, я бы посоветовал вам использовать логический метод для вашей логики и вызвать его в функции while, например:

Метод:

public static bool IsWaitingTime()
{
 if ( ( DateTime.Now.DayOfWeek == DayOfWeek.Saturday  || DateTime.Now.DayOfWeek == DayOfWeek.Sunday )
 && ( DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18 ) 
 && DateTime.Now.Minute <= 9 ) 
   return true;
else
   return false;
} 

Во время цикла:


while ( IsWaitingTime )
    {
        Random waitTime = new Random();
        int milliseconds = waitTime.Next(120000, 180000);
        System.Threading.Thread.Sleep(milliseconds);
    }

Это один из подходов, как сказал @JonH, дата не может быть и субботой, и воскресением одновременно (по крайней мере, в одном часовом поясе). ответ chris-crush-code также правильный.

...