Как задержать 5 мин перед запуском службы windows?
Я использую .Net 4 для создания простой службы windows, проблема возникает, когда я хочу сделать 5-минутную задержку перед запуском службы.
protected override void OnStart(string[] args)
{
// make a 5 min delay
// do something
}
но через несколько секунд служба останавливается и дает мне ошибку тайм-аута (видел это в журнале событий). что мне делать?
8 ответов
Начните свой длительный процесс в новом потоке, поэтому не блокируйте OnStart
метод. пример:
using System.Threading;
protected override void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback((_) =>
{
Thread.Sleep(5 * 1000 * 60);//simulate 5 minutes work
// do something
}));
}
нет. Услуги должны начинаться, когда их просят. OnStart
ВЕРНУТЬСЯ. Быстро!--5-->.
тем не менее, служба может подождать 5 минут, пока он тут что-то, но вы не можете просто остановить запуск цикла.
запустите его, затем рабочий поток ждать, пока он что-то делает.
тем не менее, есть запись конфигурации, которая позволяет запустить службу с задержкой. Он настроен на сервис, подобно Manual, Automatic
есть delayed
запись. Это гарантирует, что служба запускается только тогда, когда у машины было немного времени, чтобы успокоиться от запуска. Это может быть лучше, достаточно хорошая.
на OnStart
метод должен вернуться своевременно, иначе вы получите ошибку тайм-аута.
что вам нужно сделать, это запустить поток от OnStart
и в этом потоке подождите 5 минут, прежде чем фактически начать свою службу. Так ваш OnStart
метод приобретает следующий вид:
serviceThread = new Thread(new ThreadStart(workerClass.WorkerMethod));
serviceThread.Start();
и WorkerClass.WorkerMethod
выполняет фактический запуск службы.
служба должна отвечать, когда ей говорят начать, или Windows думает, что она неисправна. Таким образом, у вас есть два варианта:
напишите отдельное приложение, которое запускается при запуске, ждет 5 минут, а затем запускает службу.
запустите службу и поместите в нее пятиминутную задержку, прежде чем она начнет делать то, что является бизнес-логикой. Пока Windows думает, что он запустился нормально, он счастлив.
что-то вроде этого:
private static Timer t;
protected override void OnStart(string[] args)
{
t = new Timer(5000*60);
t.Elapsed += new ElapsedEventHandler(OnTimedEvent)
t.Start()
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
// real code here
}
Я не понимаю, почему вы хотите отложить процедуру запуска службы на 5 минут. если служебная процедура занимает больше времени Service Control Manager, вероятно, прерывает все операции, поэтому служба не может запуститься. Вам скорее нужно запустить поток / таймер внутри метода OnStart и подождать 5 минут в процедуре Thread/Timer.
protected override void OnStart(string[] args)
{
Thread processor= new Thread(ThreadProc);
processor.Start();
}
private void ThreadProc()
{
while (true)
{
Thread.Sleep(TimeSpan.FromMinutes(5));
}
}
используйте систему.Таймеры.Таймер для отсрочки ваших действий... Вот код от одной из моих служб. Причина, по которой я использую отсрочку, заключается в том, что windows предполагает, что служба сломана, если слишком долго возвращается из события onstart. Поскольку я делаю много вещей, когда служба впервые запускается, я запускаю службу очень быстро с созданием таймера, а затем позволяю этому событию иметь дело с реальным материалом запуска.
protected override void OnStart(string[] args)
{
try
{
// Using a timer Event to start asynchronously
StartupTimer = new Timer();
StartupTimer.Elapsed += StartupTimer_Elapsed;
StartupTimer.AutoReset = false;
StartupTimer.Interval = 5*60*1000;
StartupTimer.Start();
}
catch (Exception ex)
{
LogMessage(true, ex.ToString());
}
}
private void StartupTimer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
RunSetup(true);
}
catch (Exception ex)
{
LogMessage(true, ex.ToString());
}
}
прямой путь использовать систему.Нарезка резьбы.Таймер и установить это время до 5 минут, пожалуйста, смотрите
корень проблемы в том, что если служба занимает время, чтобы запустить Windows, будет думать, что он неисправен и убить его.
вы можете исправить это, сначала сообщив Windows, что эта служба займет некоторое время, чтобы начать.
для этого см. ответы на этот вопрос SO:время ожидания запуска службы windows