2010-06-17 68 views

回答

9

您可以使用BackgroundWorker来响应Service.Start事件执行冗长的操作。

ServiceBase衍生课程的OnStart()方法中很容易做到这一点。还有一个合理的good example on MSDN

protected override void OnStart(string[] args) 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += DoSomeLongOperation; 

    worker.RunWorkerAsync(); 
} 

private void DoSomeLongOperation(object sender, DoWorkEventArgs e) 
{ 
    // do your long operation... 
} 

请注意,您也可以订阅ProgressChangedRunWorkerCompleted事件,这样就可以通知你的进步服务控制管理器和启动成功(或失败)。

1

我必须这样做:我在启动时产生了一个线程,它完成所有初始化,并在完成时将私有'isInitialized'设置为true。该服务定期执行动作(即,在计时器上),并且如果isInitialized未设置为true,则不会开始这些动作。

1

我们通常使用一个简单的计时器来实现此功能。我们将在服务OnStartup中设置计时器,让服务响应服务控制管理器,然后让计时器在几秒钟后启动进程。这个过程可以在一个单独的线程中进行,也可以不依赖于需要完成的工作。定时器可以重复使用,如果这个过程需要定期发生。

0

最好的实用方法是创建一个工作线程。

通常存在另一种记录方式,我可以在非托管代码的例子中解释。在初始化过程中,Windows服务需要很短的时间来执行此操作。这一次可以在注册表中的某处进行更改。如果服务需要更多,如果可以拨打

SetServiceStatusdwCurrentState=SERVICE_START_PENDING一些dwCheckPointdwWaitHintSERVICE_STATUS结构的填充,使dwWaitHint是在毫秒挂起启动操作所需的估计时间。在指定的时间量过去之前,该服务应使用dwCheckPoint值递增或dwCurrentState中的一个变化对SetServiceStatus函数进行下一次调用。请参阅http://msdn.microsoft.com/en-us/library/ms685996(VS.85).aspx上的dwWaitHint说明。

1

我也有这个问题与Windows服务。我认为你必须保持初始化逻辑低于30秒,否则Windows服务管理器将停止服务。

我做的很简单。我创建了一个方法,将所有需要执行的重逻辑放在一起,然后创建一个计时器,该计时器在20秒后打勾并执行该方法。因此服务将启动,然后创建计时器,并以20秒为间隔对其进行初始化,然后完成初始化。 20秒后,计时器将打勾并启动应用程序的业务逻辑。当然,你可以指定任何你想要的时间间隔。

你应该申报计时器作为类的参数:

public partial class YourService: ServiceBase 
{ 
    System.Timers.Timer tmrOnStart; 

然后在OnStart方法

protected override void OnStart(string[] args) 
{ 
    //set the interval to 20 seconds 
    tmrOnStart = new Timer(); 
    tmrOnStart.Interval = 20000; 
    tmrOnStart.Enabled = true; 
    tmrOnStart.AutoReset = false; 
    tmrOnStart.Elapsed += new ElapsedEventHandler(tmrOnStart_Elapsed); 
    tmrOnStart.Start(); 
} 

初始化定时器当定时器会触发Elapsed事件,它将执行这种方法:

void tmrOnStart_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    heavyBusinessLogicMethod(); 
} 

而你必须把你的逻辑放在heavyBusine ssLogicMethod方法。