Exemple complet d'un service Windows utilisant la bibliothèque d'entreprise pour la consignation et les threads récurrents. Supprimer les lignes logger.write si vous n'utilisez pas la bibliothèque d'entreprise
namespace Example.Name.Space
{
public partial class SmsServices : ServiceBase
{
private static String _state = "";
private ManualResetEvent _stop = new ManualResetEvent(false);
private static RegisteredWaitHandle _registeredWait;
public WindowsServices()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Logger.Write("Starting service", LoggerCategory.Information);
_stop.Reset();
_registeredWait = ThreadPool.RegisterWaitForSingleObject(_stop,
PeriodicProcess, null, 5000, false);
}
protected override void OnStop()
{
// UpdateTimer.Stop();
_stop.Set();
Logger.Write("Stopping service", LoggerCategory.Information);
}
private static void PeriodicProcess(object state, bool timedOut)
{
if (timedOut)
{
// Periodic processing here
Logger.Write("Asserting thread state", LoggerCategory.Debug);
lock (_state)
{
if (_state.Equals("RUNNING"))
{
Logger.Write("Thread already running", LoggerCategory.Debug);
return;
}
Logger.Write("Starting thread", LoggerCategory.Debug);
_state = "RUNNING";
}
Logger.Write("Processing all messages", LoggerCategory.Information);
//Do something
lock (_state)
{
Logger.Write("Stopping thread", LoggerCategory.Debug);
_state = "STOPPED";
}
}
else
// Stop any more events coming along
_registeredWait.Unregister(null);
}
}
}
Je pense qu'un bon moyen d'accélérer la résolution de ce problème consiste à afficher l'initialisation du Timer et le code de démarrage. – Vokinneberg
En utilisant un code non managé? –
J'appelle une fonction de dll win32 natif, mais il est sur un autre thread – AFgone