Я фактически разрабатываю службу Windows в VS 2012/.NET 4.5.
Служба работает по схеме фрагмента кода ниже:
- Использование таймера
- Выполняет требуемую операцию каждые пару минут.
- Процесс занимает около 10 минут для завершения
- Я использую один поток в сервисе
Я беспокоюсь о том, что если кто-то останавливает службу через консоль управления, это может быть только во время процесса, который выполняет служба.
Я кое-что прочитал об остановке службы Windows с остановкой запроса, но немного потерял. Иногда создаются WorkerThreads, иногда создаются ManualResetEvents, но до сих пор я не мог полностью понять лучший способ для своей службы Windows.
Мне нужно подождать, пока обработка не будет закончена в методе onStop до остановки службы Windows.
Каков наилучший способ продвижения, а также рассмотрение фрагмента кода ниже?
Спасибо всем!
namespace ImportationCV
{
public partial class ImportationCV : ServiceBase
{
private System.Timers.Timer _oTimer;
public ImportationCV()
{
InitializeComponent();
if (!EventLog.SourceExists(DAL.Utilities.Constants.LOG_JOURNAL))
{
EventLog.CreateEventSource(DAL.Utilities.Constants.LOG_JOURNAL, DAL.Utilities.Constants.SOURCE_JOURNAL);
}
EventLog.Source = DAL.Utilities.Constants.SOURCE_JOURNAL;
EventLog.Log = DAL.Utilities.Constants.LOG_JOURNAL;
}
protected override void OnStart(string[] args)
{
int intDelai = Properties.Settings.Default.WatchDelay * 1000;
_oTimer = new System.Timers.Timer(intDelai);
_oTimer.Elapsed += new ElapsedEventHandler(this.Execute);
_oTimer.Start();
EventLog.WriteEntry(DAL.Utilities.Constants.LOG_JOURNAL, "Service " + DAL.Utilities.Constants.SERVICE_TITLE + " started at " + DateTime.Now.ToString("HH:mm:ss"), EventLogEntryType.Information);
}
protected override void OnStop()
{
if (_oTimer != null && _oTimer.Enabled)
{
_oTimer.Stop();
_oTimer.Dispose();
}
EventLog.WriteEntry(DAL.Utilities.Constants.LOG_JOURNAL, "Service " + DAL.Utilities.Constants.SERVICE_TITLE + " stopped at " + DateTime.Now.ToString("HH:mm:ss"), EventLogEntryType.Information);
}
private void Execute(object source, ElapsedEventArgs e)
{
_oTimer.Stop();
try
{
//Process
}
catch (Exception ex)
{
EventLog.WriteEntry(DAL.Utilities.Constants.LOG_JOURNAL, (ex.StackTrace + ("\r\n" + ex.Message)), EventLogEntryType.Error);
}
_oTimer.Start();
}
}
}