La classe ServiceBase di .NET, che è la
classe base dalla quale ereditano tutti i Windows Service, espone un metodo
RequestAdditionalTime, che
serve per "allungare" il tempo dopo il quale il Service Control Manager ci
informa che un servizio non è partito e quindi viene segnalato come not
responding.
Questo metodo può essere chiamato esclusivamente negli overload di OnContinue, OnPause, OnStart e OnStop. La pagina di MSDN lo
dice espressamente:
The RequestAdditionalTime method is intended to be
called by the overridden OnContinue, OnPause, OnStart, or OnStop methods to
request additional time for a pending operation.
Se non seguiamo questa semplice regola, qualsiasi chiamata a
RequestAdditionalTime solleva un'exception di tipo InvalidOperationException.
Oggi pomeriggio ho dovuto usare - con scarso successo - questo metodo
perchè sul mio servizio che ho sviluppato qualche giorno fa è stato
riscontrato un problema. Su un solo server virtuale di produzione, il
servizio non ha nessuna voglia di partire quando è marcato come Start Up
Automatically. Se invece lo si fa partire manualmente, il tutto gira
correttamente. Non sono riuscito a capire il perchè: la cosa interessante è che
la prima riga dell'override di OnStart scrive nell'event viewer una nuova entry
con una cosa tipo "AutoShutService starting...", ma questa voce non
viene loggata. Ciò significa che per qualche motivo il mio servizio non
raggiunge nemmeno l'OnStart, e quindi ci deve essere qualche problema prima. Non
è un problema di timeout - usare la RequestAdditionalTime non ha risolto
nulla.
Dato che questo problema è stato rilevato su un solo server virtuale siamo
più propensi a pensare che sia quel sistema ad avere qualche problema, ma mi
piacerebbe comunque capire il motivo. Lo farò a settembre, dopo le ferie: questo
è, per adesso, il mio ultimo post tecnico!
Buone ferie a tutti, stavolta davvero, però!!!
powered by IMHO 1.3