Резюме: В приложении Windows и приложении консоли я звоню в общую библиотеку, которая содержит таймер, который периодически запускает действие, которое занимает около 30 секунд. Это прекрасно работает, однако...
Когда вызывается останов службы или выход приложения, и таймер находится в ElapsedEventHandler, мне нужно, чтобы остановка/приложение службы прекращалось до завершения обработчика события.
Я реализовал эту функциональность, имея свойство Boolean InEvent, которое проверяется при вызове метода остановки таймера.
Пока это функционально, возникает вопрос: является ли это лучшим способом сделать это? Существует ли альтернативный подход, который может служить этой цели лучше?
Другая проблема заключается в том, что мне нужно избегать запроса на остановку службы, если "Служба не ответила на запрос остановки"
Это моя реализация
public sealed class TimedProcess : IDisposable
{
static TimedProcess singletonInstance;
bool InEvent;
Timer processTimer;
private TimedProcess()
{
}
public static TimedProcess Instance
{
get
{
if (singletonInstance == null)
{
singletonInstance = new TimedProcess();
}
return singletonInstance;
}
}
public void Start(double interval)
{
this.processTimer = new Timer();
this.processTimer.AutoReset = false;
this.processTimer.Interval = interval;
this.processTimer.Elapsed += new ElapsedEventHandler(this.processTimer_Elapsed);
this.processTimer.Enabled = true;
}
public void Stop()
{
if (processTimer != null)
{
while (InEvent)
{
}
processTimer.Stop();
}
}
void processTimer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
InEvent = true;
// Do something here that takes ~30 seconds
}
catch
{
}
finally
{
InEvent = false;
processTimer.Enabled = true;
}
}
public void Dispose()
{
if (processTimer != null)
{
Stop();
processTimer.Dispose();
}
}
}
И вот как он вызывается в главном приложении OnStart/console:
TimedProcess.Instance.Start(1000);
Так вызывается в сервисе OnStop и main приложения (ожидает нажатия):
TimedProcess.Instance.Stop();