Обратный звонок со временем - PullRequest
1 голос
/ 06 декабря 2010

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

    public void CallmeBack(DateTime time, Action callback)
    {

    }

Какая лучшая реализация в C #?

Моим быстрым и грязным решением было создание словаря Dictionary<DateTime, List<Action>> и создание таймера каждые (минуты / секунды) и проверка времени (DateTime.Now) и текущего времени в тестовом режиме.

Решение должно быть "Безопасным", если текущее машинное время изменилось. Поэтому такое простое решение не может работать:

        Timer timer = new Timer((param) => {callback.Invoke();}, null,
            (long)(time - DateTime.Now).TotalMilliseconds, Timeout.Infinite);

Редактировать: Типичный случай, когда простой таймер не работает - это летнее время и ручная настройка времени / даты. Кроме того, я просто хочу, чтобы обратный вызов выполнялся один раз, а не несколько раз.

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

То, что вы ищете, это библиотека cron.Есть много там.Некоторые имеют много функций и немного тяжелые.Вот запись в блоге о заданиях cron и библиотеке, которую я использовал в производственном коде.

http://blog.bobcravens.com/2009/10/an-event-based-cron-scheduled-job-in-c/

Надеюсь, это поможет вам начать.

Боб

1 голос
/ 06 декабря 2010

Несколько вариантов, которые вы можете рассмотреть:

  • Вы можете использовать планировщик задач , например: http://taskscheduler.codeplex.com/

  • Вы можете придерживаться таймера и прослушивать изменения времени, используя: SystemEvents.TimeChanged.Это событие вызывается изменениями времени пользователя.Я предполагаю, что вы можете справиться с предсказуемыми изменениями времени (летнее время и т. Д.), Когда устанавливаете таймер.Я не уверен в изменениях, связанных с NTP - вам нужно будет изучить это подробнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...