顶部货架处理回路
本文关键字:回路 处理 顶部 | 更新日期: 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;
}
}
做这件事的更好的方法是什么?
-
我考虑过使用。net
System.Threading.Tasks
来运行工作,然后可能关闭StopService()上的线程 -
可能使用石英重复任务,然后删除它。
想法吗?
一般来说,我如何处理这个是有一个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方法(因此它几乎立即运行)。这就完成了大部分的工作。在你的例子中,这可能是你正在循环的方法。然后在每个循环开始时检查一个全局关机变量-如果它为真,你退出循环,然后程序可以停止。
您可能需要比这更复杂(或更少),这取决于错误的确切位置,但我希望一般原则应该是好的。
我再次声明这些知识不是基于顶级的,只是基于一般的服务开发。