C# 在windows服务中立即运行计时器

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 {

我已经在VS.net C上创建了一个windows服务#

在OnStart事件中,我启动一个计时器

在计时器中,我调用了一个名为DO()的函数

DO()函数的进程非常长(需要一个多小时)

这个过程应该是这样的

开始,然后立即调用时间,但由于计时器间隔,需要再等待一天

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否。前台线程将阻止进程关闭。请参阅。在卸载服务后,线程仍在运行