通常,对于服务,要完成的任务会重复执行,可能是循环执行,也可能是触发器或其他。
我正在使用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邮件列表。我们试图在那方面做出快速 react 。 http://groups.google.com/group/topshelf-discuss
关于c# - Topshelf-处理循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8587423/