gpt4 book ai didi

c# - Topshelf - 处理循环

转载 作者:太空狗 更新时间:2023-10-29 21:41:03 25 4
gpt4 key购买 nike

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

我正在使用 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. 可能使用 Quartz重复任务,然后将其删除。

想法?

最佳答案

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com