Вызовите метод, когда таймер обратного отсчета до 0

Я пишу сервис на C#, и его основная функция - извлекать фотографии из базы данных и сохранять их в каталоге два раза в день. Эта операция обычно занимает около 15 минут (фотографий много). Если я включил логику для запуска программы в OnStart(), то через минуту или около того запуска службы сообщает, что она не запустилась успешно. Это потому, что он находится в методе OnStart () слишком долго.

Как я могу установить таймер в методе OnStart(), который будет вызывать мой метод RunApp() примерно через минуту?

Редактировать: вот код После настройки планировщика, который запускает его ежедневно, я также хочу просто запустить его. Я полагал, что установка таймера в течение примерно одной минуты будет работать, таким образом у него будет время выйти из метода OnStart (). Затем, когда таймер выключится, приложение запустится.

protected override void OnStart(string[] args)
{
    Scheduler sch = new Scheduler("Photo Sync");

    try
    {
      MailConfiguration mailConfig = new MailConfiguration(Properties.Settings.Default.EmailLogTo, Properties.Settings.Default.EmailLogFrom,
                                                           "Photo Sync Photo Service error", Properties.Settings.Default.SmtpServerIp, "Photo Sync");
      sch.MailComponent = mailConfig;
    }
    catch
    {

    }

    sch.SchedulerFired += new EventHandler(RunApp);

    try
    {
      sch.ScheduleDaily(Properties.Settings.Default.DailyScheduledTime);
    }

    RunApp();
}

3 ответа

Решение

Запустите функцию сохранения в отдельном потоке, который вы запускаете в методе OnStart вашего сервиса. Что-то вроде этого:

protected override void OnStart(string args[])
{

    // your other initialization code goes here

    // savePhotos is of type System.Threading.Thread
    savePhotosThread = new Thread(new ThreadStart(SavePhotos));
    savePhotosThread.IsBackground = true;
    savePhotosThread.Name = "Save Photos Thread";
    savePhotosThread.Start();

}

You'll place the functionality for saving the files in the `SavePhotos` method, maybe something like this:

private void SavePhotos()
{

    // logic to save photos
}

Я использовал код, аналогичный приведенному выше, для ведения журнала (я регистрирую статистику для службы каждые 5 минут или около того) для постоянно включенной службы, которую я написал несколько лет назад. Не забудьте добавить System.Threading к вашему сервису и директиву using.

Как правило, нормальным процессом запуска службы Windows является создание потока, и этот поток выполняет обработку службы, позволяя OnStart своевременно выйти для Windows. Поток все еще находится в фоновом режиме обработки вещей. Например:

protected CancellationTokenSource _tokenSource = null;

protected override void OnStart(string[] args)
{
    _tokenSource = new CancellationTokenSource();

    Task processingTask = new Task(() =>
       {
           while(!_tokenSource.IsCancellationRequested)
           {
               // Do your processing
           }
       });

    processingTask.Start();
}

protected override void OnStop()
{
    _tokenSource.Cancel();
}

Если ваша служба не должна работать бесконечно, вы можете рассмотреть запланированное задание.

    System.Threading.Timer Timer1 = new System.Threading.Timer(RunApp, null, 1000, System.Threading.Timeout.Infinite);

void RunApp(object State)
{
}
Другие вопросы по тегам