通常,对于服务,要完成的任务会重复执行,可能是循环执行,也可能是触发器或其他。

我正在使用Topshelf为我完成重复的任务,特别是我正在使用Shelf'ing功能。

我遇到的问题是如何处理任务循环。

在Topshelf中引导捆绑服务时,您将其传递给一个类(在本例中为ScheduleQueueService),并指示哪个是其Start方法和Stop方法:

例子:

    public class QueueBootstrapper : Bootstrapper<ScheduledQueueService>
{
    public void InitializeHostedService(IServiceConfigurator<ScheduledQueueService> cfg)
    {
        cfg.HowToBuildService(n => new ScheduledQueueService());
        cfg.SetServiceName("ScheduledQueueHandler");
        cfg.WhenStarted(s => s.StartService());
        cfg.WhenStopped(s => s.StopService());
    }
}

但是在StartService()方法中,我使用while循环重复执行正在运行的任务,但是当我尝试通过Windows服务停止服务时,它无法停止,并且我怀疑它是因为StartService()方法在最初被调用时从未结束。

例子:
 public class ScheduledQueueService
{
    bool QueueRunning;

    public ScheduledQueueService()
    {
      QueueRunning = false;
     }


    public void StartService()
    {
        QueueRunning = true;

        while(QueueRunning){
                     //do some work
         }
    }

  public void StopService()
  {
         QueueRunning = false;
  }
}

有什么更好的办法做到这一点?

我已经考虑过使用.NET System.Threading.Tasks在其中运行工作,然后关闭StopService()上的线程
  • 也许使用Quartz重复执行该任务,然后将其删除。

  • 有什么想法吗?

    最佳答案

    通常,我如何处理这个问题是有一个Timer事件,该事件会在调用StartService()之后触发。在事件结束时,我将检查stop标志(在StopService()中设置),如果该标志(例如QueueRunning)不存在,那么我会在计时器上注册一个事件,稍后再发生。

    在轮询文件系统时,我们在Topshelf自身中执行了类似的操作:https://github.com/Topshelf/Topshelf/blob/v2_master/src/Topshelf/FileSystem/PollingFileSystemEventProducer.cs#L80

    现在,它使用内部调度程序类型而不是Timer对象,但是通常是同一回事。 fiber基本上是在哪个线程上处理事件。

    如果您还有其他疑问,也欢迎您加入Topshelf邮件列表。我们试图在那方面做出快速 react 。 http://groups.google.com/group/topshelf-discuss

    关于c# - Topshelf-处理循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8587423/

    10-08 23:53