Вызовите метод, когда таймер обратного отсчета до 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)
{
}