顶部货架处理回路

本文关键字:回路 处理 顶部 | 更新日期: 2023-09-27 18:18:41

对于服务,您想要完成的任务通常是重复的,可能是在循环中,可能是在触发器中,也可能是在其他地方。

我正在使用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;
  }
}

做这件事的更好的方法是什么?

  1. 我考虑过使用。net System.Threading.Tasks来运行工作,然后可能关闭StopService()上的线程

  2. 可能使用石英重复任务,然后删除它。

想法吗?

顶部货架处理回路

一般来说,我如何处理这个是有一个Timer事件,在StartService()被调用后的几分钟内触发。在事件结束时,我会检查stop标志(设置在StopService()中),如果标志(例如您的QueueRunning)不存在,那么我会在计时器上注册单个事件,以便在几分钟内再次发生。

当轮询文件系统时,我们在Topshelf本身中做了非常类似的事情:https://github.com/Topshelf/Topshelf/blob/v2_master/src/Topshelf/FileSystem/PollingFileSystemEventProducer.cs#L80

现在它使用内部调度器类型而不是Timer对象,但通常情况下是一样的。fiber基本上是在哪个线程上处理事件。

如果您将来有问题,也欢迎您加入Topshelf邮件列表。我们尽量在这方面反应灵敏。http://groups.google.com/group/topshelf-discuss

我今天正在编写一些类似的代码,我偶然发现了https://stackoverflow.com/a/2033431/981,它对我来说就像一个魅力。

我不太了解Topshelf,但是在编写标准的windows服务时,您希望启动和停止事件尽可能快地完成。例如,如果启动线程花费的时间太长,windows就认为它启动失败。

为了解决这个问题,我通常使用System.Timers.Timer。它被设置为只以非常短的间隔调用一次startup方法(因此它几乎立即运行)。这就完成了大部分的工作。

在你的例子中,这可能是你正在循环的方法。然后在每个循环开始时检查一个全局关机变量-如果它为真,你退出循环,然后程序可以停止。

您可能需要比这更复杂(或更少),这取决于错误的确切位置,但我希望一般原则应该是好的。

我再次声明这些知识不是基于顶级的,只是基于一般的服务开发。