C# 在windows服务中立即运行计时器
我已经在VS.net C上创建了一个windows服务# 在OnStart事件中,我启动一个计时器 在计时器中,我调用了一个名为DO()的函数 DO()函数的进程非常长(需要一个多小时) 这个过程应该是这样的 开始,然后立即调用时间,但由于计时器间隔,需要再等待一天C# 在windows服务中立即运行计时器,c#,.net,windows-services,C#,.net,Windows Services,我已经在VS.net C上创建了一个windows服务# 在OnStart事件中,我启动一个计时器 在计时器中,我调用了一个名为DO()的函数 DO()函数的进程非常长(需要一个多小时) 这个过程应该是这样的 开始,然后立即调用时间,但由于计时器间隔,需要再等待一天 protected override void OnStart(string[] args) { eventLog1.WriteEntry("In OnStart."); try {
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart.");
try
{
Timer timer = new Timer();
timer.Interval = 1000 * 60 *60 * 24;
timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
timer.Start();
DO();
}
catch (Exception ex)
{
eventLog1.WriteEntry("ERROR (OnStart) : " + ex.ToString());
}
}
public void OnTimer(object sender, ElapsedEventArgs args)
{
DO();
}
private void DO()
{
// Some process takes an hour
}
当服务启动时,它会在“启动”中停留一个小时
是否有一种方法可以在服务启动后立即启动service DO()函数,但不能从OnStart事件启动
假设您的示例中没有遗漏任何内容,您的timer-appeated方法将在
线程池上运行
所以我会在OnStart
DO();
…使用这一行:
ThreadPool.QueueUserWorkItem(x => Do());
如果计时器立即启动,并且更重要的是,不会阻塞该线路,则会产生与此相同的净效果。关于Windows服务,一般来说,如果您的代码耗时过长,则启动时Windows Service Manager会将您的服务标记为无响应。因此,OnStart()
和更重要的Do()
不应执行“某些过程需要一个小时”OnStart
应执行最少的工作,并根据需要生成子线程。此外,您还应该考虑设置您的服务状态。是的,请使用BackgroundWorker,例如…。要解决“启动”问题,只需在OnStart
中删除对DO()
的调用,当我停止服务时线程是否会停止?@asmgx yes,因为线程池线程是后台线程。@asmgx每当进程退出时,所有文件句柄和线程都是后台线程closed@MickyD否。前台线程将阻止进程关闭。请参阅。在卸载服务后,线程仍在运行