我正在使用C#在Visual Studio 2010中创建一个Windows服务,其中有一些方法,如Add
、Multiply
等,我将它们放在onStart
方法中。现在,我希望这些方法每隔五分钟运行一次。那么后台工作进程如何帮助我实现这个目标呢?
protected override void OnStart(string[] args)
{
add(); // yes, it doesn't have parameters
}
我正在使用C#在Visual Studio 2010中创建一个Windows服务,其中有一些方法,如Add
、Multiply
等,我将它们放在onStart
方法中。现在,我希望这些方法每隔五分钟运行一次。那么后台工作进程如何帮助我实现这个目标呢?
protected override void OnStart(string[] args)
{
add(); // yes, it doesn't have parameters
}
将这些功能封装到一个类中,并在该类中创建一个System.Timers.Timer(),并在定时器中调用所有这些函数。在服务的OnStart
中调用NewClass示例类的Start()函数。
class NewClass
{
this._watcherTimer = new System.Timers.Timer();
this._watcherTimer.Interval = 60000;
this._watcherTimer.Enabled=False;
this._watcherTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.Timer_Tick);
public void Start()
{
this._watcherTimer.Enabled=true;
}
private void Timer_Tick(object sender, EventArgs e)
{
Add();
Multiply();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
namespace SampleWinSvc
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
#if (!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new Service1() };
ServiceBase.Run(ServicesToRun);
#else
//Debug code: this allows the process to run
// as a non-service. It will kick off the
// service start point, and then run the
// sleep loop below.
Service1 service = new Service1();
service.Start();
// Break execution and set done to true to run Stop()
bool done = false;
while (!done)
Thread.Sleep(10000);
service.Stop();
#endif
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Timers;
using System.Text;
namespace SampleWinSvc
{
public partial class Service1 : ServiceBase
{
/// <summary>
/// This timer willl run the process at the interval specified (currently 10 seconds) once enabled
/// </summary>
Timer timer = new Timer(10000);
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Start();
}
public void Start()
{
// point the timer elapsed to the handler
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
// turn on the timer
timer.Enabled = true;
}
/// <summary>
/// This is called when the service is being stopped.
/// You need to wrap up pretty quickly or ask for an extension.
/// </summary>
protected override void OnStop()
{
timer.Enabled = false;
}
/// <summary>
/// Runs each time the timer has elapsed.
/// Remember that if the OnStop turns off the timer,
/// that does not guarantee that your process has completed.
/// If the process is long and iterative,
/// you may want to add in a check inside it
/// to see if timer.Enabled has been set to false, or
/// provide some other way to check so that
/// the process will stop what it is doing.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
MyFunction();
}
private int secondsElapsed = 0;
void MyFunction()
{
secondsElapsed += 10;
}
}
}
使用Backgroundworker的另一个可能解决方案:
public partial class Service1 : ServiceBase
{
private System.ComponentModel.BackgroundWorker bwMyWorker;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
bwMyWorker = new BackgroundWorker();
bwMyWorker.DoWork += delegate(object sender, DoWorkEventArgs workArgs)
{
//Endless loop
for (; ; )
{
//Your work... E.g. add()
System.Threading.Thread.Sleep(new TimeSpan(0, 5, 0)); //Pause for 5 min
}
};
bwMyWorker.RunWorkerAsync();
}
System.Timers.Timer
更有帮助。BackgroundWorker
适合在另一个线程中完成工作而不会阻塞当前线程(如UI线程)。 - vcsjones