Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows Services: OnStart loop - do I need to delegate?

I've got a windows service which scans a folder every n seconds for changes. I'm getting "the service did not respond to the start command in a timely fashion" when trying to start it up.

I've got a loop setting off in OnStart like so:

 public void OnStart(string[] args)
 {
    while (!_shouldExit)
    {
        //Do Stuff

        //Repeat
        Thread.Sleep(_scanIntervalMillis);
    }
 }

Is this what is causing the error? Should I delegate this method?

like image 772
Rob Stevenson-Leggett Avatar asked Mar 16 '09 10:03

Rob Stevenson-Leggett


2 Answers

OnStart should only start the work; it isn't responsible for doing it. This typically means spawning a new thread to do the actual work. It is expected that OnStart completes promptly. For example:

    public void OnStart(string[] args) // should this be override?
    {
        var worker = new Thread(DoWork);
        worker.Name = "MyWorker";
        worker.IsBackground = false;
        worker.Start();
    }
    void DoWork()
    {
        // do long-running stuff
    }
like image 180
Marc Gravell Avatar answered Oct 15 '22 20:10

Marc Gravell


The OnStart method shouldn't block. You need to spawn a worker thread that will do the job. You could also take a look at the FileSystemWatcher class to scan for file system change notifications.

like image 6
Darin Dimitrov Avatar answered Oct 15 '22 19:10

Darin Dimitrov