Отправлять объявления с интервалом X или предварительно определенное время? - PullRequest
0 голосов
/ 05 ноября 2011

Мне нужно, чтобы функция, работающая с ней, выиграла поток, чтобы делать объявления в определенное время, например:

  • "Посетите наш сайт по адресу: ...." и запуститекаждые 5 минут
  • «Проверять свое место в рейтинге по адресу: ....», чтобы запускать каждые 10 минут

Я немного запутался, если мне нужно использовать таймер потокаили поток во время сна и как рассчитать, когда должны запускаться все объявления.

Для начала я рассматривал список класса для хранения каждого объявления, которое нужно сделать, что-то вроде List<MyTimer> с классомas:

public MyTimer
{
    public string Announcement { get; set; }
    public int Interval { get; set; } // if interval is 0 means 
                                      // it will run just once
    public bool hasSpecificTime { get; set; } // if this is true then will run
                                              // only once at the SpecificTime
    public bool Done { get; set; }
    public DateTime SpecificTime { get; set; }
}

После использования будут удалены объявления определенного времени.

Что касается потока, я подумывал использовать что-то вроде этого:

Timer = new System.Threading.Timer(TimerCallback, null, 0, 1000);

private void TimerCallback(object state)
{
    foreach (var item in timerList)
    {
        // not sure how to handle the intervals of each continuous announcement
        // some code here for the the above

        // Not sure if this would work either because of the milliseconds etc
        // on the DateTime
        if (item.hasSpecificTime && !item.Done && SpecificTime == DateTime.Now)
        {
            SendAnnouncement(item.Announcement);
            item.Done = true;
        }
    }
}
  • Моя реализация в порядке для того, что мне нужно?

  • Как мне обработать интервал и время внутри функции, как я уже сказал в вопросе, я не уверен, как получитьон рассчитал отправить его в правильное время?

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Вам нужно изменить

item.hasSpecificTime && !item.Done && SpecificTime == DateTime.Now

на

item.hasSpecificTime && !item.Done && SpecificTime <= DateTime.Now

, иначе вы будете почти на всех событиях.

Если ваш timerList станет большим, вы должны двигаться завершеннымэлементы в отдельный список вместо этого, чтобы избежать циклического повторения множества завершенных элементов.

Редактировать
Вам также необходимо увеличить SpecificTime с Interval для повторяющихся событий.

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

Одна из схем, которую вы можете использовать, - хранить экземпляры MyTimer вупорядоченная очередь, в которой вы держите ближайший SpecifiedTime первым.Затем вы можете запланировать TimerCallback на продолжительность до первого элемента в очереди вместо того, чтобы повторно опрашивать полный список.Тебе тоже нужно вести бухгалтерию.Если вы вставляете новый элемент в очередь, и этот элемент оказывается следующим из выполняемых (появляется первым в очереди), вам необходимо отменить и перезапустить таймер.

Это более «элегантно», нонеобходимо, только если у вас много событий и у вас проблемы с производительностью (или разрешение 1000 мс недостаточно детализировано).

0 голосов
/ 05 ноября 2011

Просто предложение: не обижайтесь, пожалуйста. Но в этом случае вы должны попробовать Rx operator , который будет намного чище и более удобен в обслуживании, чем пользовательская реализация таймера или потока. Должна ли реализация потоков быть как можно более сложной, чтобы их было сложнее управлять и поддерживать.

...