Timer Elapsed event does not fire | | |
Hello all,
I am having trouble creating a windows service with a timer.
Everything seems to go ok but the elapsed event does not fire.Can
anyone shed any light on this, may be something simple as I am new to
this. Full code below :
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.IO;
using System.Web.Mail;
using System.Data.SqlClient;
using System.Globalization;
using System.Timers;
namespace NAVEmailPO
{
public class NAVEmailPO : System.ServiceProcess.ServiceBase
{
public bool debug = true;
private System.Timers.Timer _Timer = new Timer();
public string SMTPServer, sDBServer, sDB, sUID, sPass,
sContactField;
private SqlConnection oConn;
private int _Interval = 50000;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components =
null;
public NAVEmailPO()
{
// This call is required by the Windows.Forms
Component Designer.
InitializeComponent();
// TODO: Add any initialization after the
InitComponent call
}
// The main entry point for the process
static void Main()
{
System.ServiceProcess.ServiceBase[]
ServicesToRun;
// More than one user Service may run within
the same process. To
add
// another service to this process, change the
following line to
// create a second service object. For example,
//
// ServicesToRun = new
System.ServiceProcess.ServiceBase[] {new
Service1(), new MySecondUserService()};
//
ServicesToRun = new
System.ServiceProcess.ServiceBase[] { new
NAVEmailPO() };
System.ServiceProcess.ServiceBase.Run(ServicesToRu n);
}
/// <summary>
/// Required method for Designer support - do not
modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new
System.ComponentModel.Container();
this.ServiceName = "NAVEmailPO";
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
/// <summary>
/// Set things in motion so your service can do its
work.
/// </summary>
protected override void OnStart(string[] args)
{
GetConfig();
_Timer.Interval = _Interval;
_Timer.Elapsed += new
System.Timers.ElapsedEventHandler(
this._Timer_Elapsed );
_Timer.Enabled = true;
_Timer.Start();
}
/// <summary>
/// Stop this service.
/// </summary>
protected override void OnStop()
{
_Timer.Stop();
_Timer.Enabled = false;
}
/// <summary>
/// Pause this service.
/// </summary>
protected override void OnPause()
{
_Timer.Stop();
}
/// <summary>
/// Continue this service.
/// </summary>
protected override void OnContinue()
{
_Timer.Start();
}
/// <summary>
/// Respond to the _Timer elapsed event.
/// <summary>
private void _Timer_Elapsed(object sender,
System.Timers.ElapsedEventArgs e)
{
_Timer.Stop();
//Run Code
writeLog("TIMER ELAPSED",true);
ProcessPO();
_Timer.Start();
}
/// <summary>
/// Gets configuration settings from text file
/// </summary>
private void GetConfig()
{
try
{
FileInfo fConf = new
FileInfo(@"c:\POSettings.txt");
if (debug) {writeLog("Creating
FileInfo", false);}
StreamReader s = fConf.OpenText();
if (debug) {writeLog("Opened File",
false);}
string read = null;
if (debug) {writeLog("Reading File",
false);}
while ((read = s.ReadLine()) != null)
{
getParam(read);
}
s.Close();
}
catch (Exception e)
{
writeLog("System Error Retrieving
Configuration" +
e.Message.ToString(), true);
}
}
/// <summary>
/// Populates global variables with values passed from
GetConfig()
/// </summary>
private void getParam(string sKeyVal)
{
if (debug) {writeLog("Retrieving Values using
:" + sKeyVal, false);}
if (sKeyVal.Substring(0,3).ToUpper() != "REM")
{
if (sKeyVal.IndexOf(",",0) > 0)
{
string[] aKeyVal =
sKeyVal.Split(',');
string sKey =
aKeyVal[0].ToUpper();
string sVal = aKeyVal[1];
switch (sKey)
{
case "SMTPSERVER":
SMTPServer =
sVal;
if (debug)
{writeLog("Param val = "+sVal ,false);}
break;
case "DATABASESERVER":
sDBServer =
sVal;
if (debug)
{writeLog("Param val = "+sVal ,false);}
break;
case "DATABASE":
sDB = sVal;
if (debug)
{writeLog("Param val = "+sVal ,false);}
break;
case "USERNAME":
sUID = sVal;
if (debug)
{writeLog("Param val = "+sVal ,false);}
break;
case "PASSWORD":
sPass = sVal;
if (debug)
{writeLog("Param val = "+sVal ,false);}
break;
default:
writeLog("Parameter not in local variables. Param = "+sKey
,false);
break;
}
}
}
}
/// <summary>
/// Looks for Purchase Orders to process and generates
emails for
suppliers
/// </summary>
private bool ProcessPO()
{
string sDSN = "provider=SQLOLEDB.1;server=" +
sDBServer + ";UID=" +
sUID + ";PWD=" + sPass + ";DATABASE=" + sDB;
oConn = new SqlConnection(sDSN);
string sSQL = "SELECT [No_] as No, [Buy-from
Vendor No_] as VNo FROM
[CrocusDevelopmentupdate$Purch_ orders for e-mailing] WHERE Processed =
0 AND [Document Type] = 1";
SqlCommand oCommand = new
SqlCommand(sSQL,oConn);
SqlDataReader oRS;
try
{
oConn.Open();
oRS =
oCommand.ExecuteReader(CommandBehavior.Default);
writeLog("Processing Started", false);
while (oRS.Read())
{
writeLog("No = " +
oRS["No"].ToString(), false);
}
oRS.Close();
oConn.Close();
}
catch (Exception e)
{
writeLog("Processing PO's DB error : "
+ e.Message,true);
}
//oConn.Close();
return true;
}
/// <summary>
/// Write messages to the application event log
/// </summary>
public bool writeLog(string sMessage, bool bError)
{
string log = "Application";
string sSource = "NAVEmailPO";
EventLogEntryType oType;
if (!EventLog.SourceExists(sSource))
{
EventLog.CreateEventSource(sSource,
log);
}
EventLog oLog = new EventLog();
oLog.Source = sSource;
if (String.Compare(oLog.Log, log, true,
CultureInfo.InvariantCulture) != 0)
{
//Shafted log in use by something else
return false;
}
if (bError)
{
oType = EventLogEntryType.Warning;
}
else
{
oType = EventLogEntryType.Information;
}
oLog.WriteEntry(sMessage, oType);
oLog.Close();
oLog.Dispose();
return true;
}
} | | | | re: Timer Elapsed event does not fire
Hi,
It should work ok, I have a similar deployment but instead of using a Timer
I use a FileSystemWatcher and it does work fine, did you check the
Application event log ?
what about this Config method?
what if you put this code in a win app, does it work fine?
cheers,
--
Ignacio Machin,
ignacio.machin AT dot.state.fl.us
Florida Department Of Transportation
"Besta" <GaryBesta@gmail.com> wrote in message
news:1126610647.277286.307000@g47g2000cwa.googlegr oups.com...[color=blue]
> Hello all,
> I am having trouble creating a windows service with a timer.
> Everything seems to go ok but the elapsed event does not fire.Can
> anyone shed any light on this, may be something simple as I am new to
> this. Full code below :
>
>
> using System;
> using System.Collections;
> using System.ComponentModel;
> using System.Data;
> using System.Diagnostics;
> using System.ServiceProcess;
> using System.IO;
> using System.Web.Mail;
> using System.Data.SqlClient;
> using System.Globalization;
> using System.Timers;
>
>
> namespace NAVEmailPO
> {
> public class NAVEmailPO : System.ServiceProcess.ServiceBase
> {
> public bool debug = true;
> private System.Timers.Timer _Timer = new Timer();
> public string SMTPServer, sDBServer, sDB, sUID, sPass,
> sContactField;
> private SqlConnection oConn;
> private int _Interval = 50000;
>
>
> /// <summary>
> /// Required designer variable.
> /// </summary>
> private System.ComponentModel.Container components =
> null;
>
>
> public NAVEmailPO()
> {
> // This call is required by the Windows.Forms
> Component Designer.
> InitializeComponent();
>
>
> // TODO: Add any initialization after the
> InitComponent call
> }
>
>
> // The main entry point for the process
> static void Main()
> {
> System.ServiceProcess.ServiceBase[]
> ServicesToRun;
>
>
> // More than one user Service may run within
> the same process. To
> add
> // another service to this process, change the
> following line to
> // create a second service object. For example,
>
> //
> // ServicesToRun = new
> System.ServiceProcess.ServiceBase[] {new
> Service1(), new MySecondUserService()};
> //
> ServicesToRun = new
> System.ServiceProcess.ServiceBase[] { new
> NAVEmailPO() };
>
>
>
> System.ServiceProcess.ServiceBase.Run(ServicesToRu n);
> }
>
>
> /// <summary>
> /// Required method for Designer support - do not
> modify
> /// the contents of this method with the code editor.
> /// </summary>
> private void InitializeComponent()
> {
> components = new
> System.ComponentModel.Container();
> this.ServiceName = "NAVEmailPO";
> }
>
>
> /// <summary>
> /// Clean up any resources being used.
> /// </summary>
> protected override void Dispose( bool disposing )
> {
> if( disposing )
> {
> if (components != null)
> {
> components.Dispose();
> }
> }
> base.Dispose( disposing );
> }
>
>
> /// <summary>
> /// Set things in motion so your service can do its
> work.
> /// </summary>
> protected override void OnStart(string[] args)
> {
> GetConfig();
> _Timer.Interval = _Interval;
> _Timer.Elapsed += new
> System.Timers.ElapsedEventHandler(
> this._Timer_Elapsed );
> _Timer.Enabled = true;
> _Timer.Start();
> }
>
>
> /// <summary>
> /// Stop this service.
> /// </summary>
> protected override void OnStop()
> {
> _Timer.Stop();
> _Timer.Enabled = false;
> }
> /// <summary>
> /// Pause this service.
> /// </summary>
> protected override void OnPause()
> {
> _Timer.Stop();
> }
> /// <summary>
> /// Continue this service.
> /// </summary>
> protected override void OnContinue()
> {
> _Timer.Start();
> }
>
>
> /// <summary>
> /// Respond to the _Timer elapsed event.
> /// <summary>
> private void _Timer_Elapsed(object sender,
> System.Timers.ElapsedEventArgs e)
> {
> _Timer.Stop();
> //Run Code
> writeLog("TIMER ELAPSED",true);
> ProcessPO();
> _Timer.Start();
> }
> /// <summary>
> /// Gets configuration settings from text file
> /// </summary>
> private void GetConfig()
> {
> try
> {
> FileInfo fConf = new
> FileInfo(@"c:\POSettings.txt");
> if (debug) {writeLog("Creating
> FileInfo", false);}
> StreamReader s = fConf.OpenText();
> if (debug) {writeLog("Opened File",
> false);}
> string read = null;
> if (debug) {writeLog("Reading File",
> false);}
> while ((read = s.ReadLine()) != null)
> {
> getParam(read);
> }
> s.Close();
> }
> catch (Exception e)
> {
> writeLog("System Error Retrieving
> Configuration" +
> e.Message.ToString(), true);
> }
> }
>
>
> /// <summary>
> /// Populates global variables with values passed from
> GetConfig()
> /// </summary>
> private void getParam(string sKeyVal)
> {
> if (debug) {writeLog("Retrieving Values using
> :" + sKeyVal, false);}
> if (sKeyVal.Substring(0,3).ToUpper() != "REM")
> {
> if (sKeyVal.IndexOf(",",0) > 0)
> {
> string[] aKeyVal =
> sKeyVal.Split(',');
> string sKey =
> aKeyVal[0].ToUpper();
> string sVal = aKeyVal[1];
> switch (sKey)
> {
> case "SMTPSERVER":
> SMTPServer =
> sVal;
> if (debug)
> {writeLog("Param val = "+sVal ,false);}
> break;
> case "DATABASESERVER":
> sDBServer =
> sVal;
> if (debug)
> {writeLog("Param val = "+sVal ,false);}
> break;
> case "DATABASE":
> sDB = sVal;
> if (debug)
> {writeLog("Param val = "+sVal ,false);}
> break;
> case "USERNAME":
> sUID = sVal;
> if (debug)
> {writeLog("Param val = "+sVal ,false);}
> break;
> case "PASSWORD":
> sPass = sVal;
> if (debug)
> {writeLog("Param val = "+sVal ,false);}
> break;
> default:
>
> writeLog("Parameter not in local variables. Param = "+sKey
> ,false);
> break;
> }
> }
> }
> }
> /// <summary>
> /// Looks for Purchase Orders to process and generates
> emails for
> suppliers
> /// </summary>
> private bool ProcessPO()
> {
> string sDSN = "provider=SQLOLEDB.1;server=" +
> sDBServer + ";UID=" +
> sUID + ";PWD=" + sPass + ";DATABASE=" + sDB;
> oConn = new SqlConnection(sDSN);
> string sSQL = "SELECT [No_] as No, [Buy-from
> Vendor No_] as VNo FROM
> [CrocusDevelopmentupdate$Purch_ orders for e-mailing] WHERE Processed =
>
> 0 AND [Document Type] = 1";
> SqlCommand oCommand = new
> SqlCommand(sSQL,oConn);
> SqlDataReader oRS;
> try
> {
> oConn.Open();
> oRS =
> oCommand.ExecuteReader(CommandBehavior.Default);
> writeLog("Processing Started", false);
> while (oRS.Read())
> {
> writeLog("No = " +
> oRS["No"].ToString(), false);
> }
> oRS.Close();
> oConn.Close();
>
>
> }
> catch (Exception e)
> {
> writeLog("Processing PO's DB error : "
> + e.Message,true);
> }
> //oConn.Close();
> return true;
> }
> /// <summary>
> /// Write messages to the application event log
> /// </summary>
> public bool writeLog(string sMessage, bool bError)
> {
> string log = "Application";
> string sSource = "NAVEmailPO";
> EventLogEntryType oType;
> if (!EventLog.SourceExists(sSource))
> {
> EventLog.CreateEventSource(sSource,
> log);
> }
> EventLog oLog = new EventLog();
>
>
> oLog.Source = sSource;
> if (String.Compare(oLog.Log, log, true,
> CultureInfo.InvariantCulture) != 0)
> {
> //Shafted log in use by something else
> return false;
> }
> if (bError)
> {
> oType = EventLogEntryType.Warning;
> }
> else
> {
> oType = EventLogEntryType.Information;
> }
> oLog.WriteEntry(sMessage, oType);
> oLog.Close();
> oLog.Dispose();
> return true;
> }
>
>
> }
>[/color] | | | | re: Timer Elapsed event does not fire
Ignacio,
Thanks for the help. I created a new service and copied the code
and pasted it in. It now seems to work ok, so not sure what was
happening. I will slowly integrate the code back in and see how it
progresses.
Gary |  | Similar C# / C Sharp bytes | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,392 network members.
|