Synchronous I/O within an async/await-based Windows Service

后端 未结 3 806
梦毁少年i
梦毁少年i 2021-01-04 13:26

Let\'s say I have a Windows Service which is doing some bit of work, then sleeping for a short amount of time, over and over forever (until the service is shut down). So in

3条回答
  •  抹茶落季
    2021-01-04 13:54

    If you still spawn your threads, well, yes, it's bad. Because it will not give you any benefit as the thread is still allocated and consuming resources for the specific purpose of running your worker function. Running a few threads to be able to do work in parallel within a service has a minimal impact on your application.

    If DoSomething() is synchronous, you could switch to the Timer class instead. It allows multiple timers to use a smaller amount of threads.

    If it's important that the jobs can complete, you can modify your worker classes like this:

    SemaphoreSlim _shutdownEvent = new SemaphoreSlim(0,1);
    
    public async Task Stop()
    {
        return await _shutdownEvent.WaitAsync();
    }
    
    private void WorkerThreadFunc()
    {
        while (!shuttingDown)
        {
            DoSomething();
            Thread.Sleep(10);
        }
        _shutdownEvent.Release();
    }
    

    .. which means that during shutdown you can do this:

    var tasks = myServices.Select(x=> x.Stop());
    Task.WaitAll(tasks);
    

提交回复
热议问题