6

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

我正在使用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. 我考虑过使用 .NETSystem.Threading.Tasks来运行工作,然后可能在 StopService() 上关闭线程

  2. 也许使用Quartz重复任务然后将其删除。

想法?

4

3 回答 3

3

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

在轮询文件系统时,我们在 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

于 2011-12-21T14:46:40.467 回答
2

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

于 2013-02-14T16:04:16.000 回答
0

我不具体了解 Topshelf,但在编写标准 Windows 服务时,您希望启动和停止事件尽快完成。例如,如果启动线程花费的时间太长,则窗口会假定它启动失败。

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

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

您可能需要比这更多(甚至更少)的复杂性,具体取决于错误的确切位置,但我希望一般原则应该没问题。

再一次,虽然我要否认这些知识不是基于顶级的,只是一般服务开发。

于 2011-12-21T09:52:14.463 回答