问题标签 [topshelf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
759 浏览

model-view-controller - 在 MVC Web 应用程序上运行 TopShelf

我需要为正在构建的 Web 应用程序执行一些后台任务。我喜欢使用Topshelf在服务器上运行服务的外观。我想知道初始化服务的最佳方式。我想知道从 MVC 应用程序启动时启动服务是否是个坏主意

例如:

显然,启动应用程序的工作是在它自己的任务中运行的。有没有更好的方法来做到这一点?你能看出这有什么问题吗?

我的想法是,一旦服务启动,它将从那时起自行处理。

我唯一的想法是:如果您多次重新启动 Web 应用程序,但我想我可以输入一些逻辑来检查服务是否已经在运行,然后不要启动另一个。

0 投票
3 回答
5542 浏览

c# - Topshelf - 处理循环

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

我正在使用Topshelf为我完成重复的任务,特别是我正在使用 Shelf'ing 功能。

我遇到的问题是如何处理任务的循环。

在 Topshelf 中引导服务时,您向它传递一个类(在本例中ScheduleQueueService)并指出哪个是它的Start方法和它的Stop方法:

例子:

但是在我的StartService()方法中,我使用 while 循环来重复我正在运行的任务,但是当我尝试通过 Windows 服务停止服务时,它无法停止,我怀疑它是因为该StartService()方法在最初被调用时从未结束。

例子:

这样做的更好方法是什么?

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

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

想法?

0 投票
5 回答
30325 浏览

c# - Windows 服务中的 Console.WriteLine()?

我目前正在使用带有控制台应用程序的 TopShelf 来创建 Windows 服务。当我将代码作为控制台应用程序运行时,我使用了一些 Console.WriteLine() 来输出结果。一旦代码完成了它应该做的事情,我将控制台应用程序安装为 Windows 服务。

即使 Windows 服务无法写入控制台,离开 Console.WriteLine() 代码是否有任何缺点?如果我将 Console.WriteLine() 留在其中,是否存在代码不稳定的风险?

0 投票
1 回答
2149 浏览

udp - Windows 服务中的 Log4net UDP Appender

我有一个使用 TopShelf 开发的非常简单的 Windows 服务。我正在使用 log4net 并配置了 UDP Appender。我正在使用一个名为 Log2Console 的应用程序来查看 UDP 日志。

当我将应用程序作为 exe 运行时,一切正常,我可以在 Log2Console 中看到 UDP 日志。但是,当我使用 TopShelf 将 exe 作为服务安装并启动它时,我看不到任何 UDP 日志。

我试过关闭 Windows 防火墙,看看是否会有所作为,但没有。我也尝试过更改服务登录详细信息,但也没有运气。

有什么建议么?

谢谢。

0 投票
1 回答
2363 浏览

windows-services - TopShelf、Ninject 和 EF 代码优先的 Ninject 范围问题

我目前正在使用带有 Ninject 的 TopShelf 来创建 Windows 服务。我有以下代码来使用 TopShelf 设置 Windows 服务:

这是完成所有工作的 Windows 服务背后的对象:

这些是 Ninject 绑定:

首先让我说我对这段代码不满意。当应用程序启动时,会创建一个内核实例,从设置中获取值,然后我使用 TopShelf 使用 BotService 对象创建一个 Windows 服务。

每次计时器事件触发时,都会执行 Run() 方法。这里创建了另一个内核实例,它再次读取设置并根据值获取接口的所有实现并执行相应的方法。这些实现中的每一个都有一个构造函数,其中注入了 IUnitOfWork 和 IMyRepository 以进行数据访问。

当方法完成后,我处理上下文并处理内核。

我为什么要这样设置?最初我只在 Main 中创建了一个内核,并在 BotService 中使用构造函数来注入实现,而不是创建另一个内核实例。问题是 DatabaseFactory 需要 InSingletonScope 或 InThreadScope 才能工作。

如果我使用 InSingeltonScope,上下文将变得陈旧,最终问题将开始在上下文无效的地方蔓延。如果我使用 InThreadScope 我会遇到同样的问题,因为一旦线程完成它就不会处理对象。最终 Run() 使用了以前使用过的线程,并且发生了异常,因为我已经处理了 Context。如果我删除了我很好地处理上下文的代码行,那么我们会遇到与 InSingletonScope 相同的问题,当线程被重新使用时,我们最终会得到一个陈旧的上下文。

这导致了当前代码,我保证每次执行 Time Run() 时,上下文都在附近,直到它在它被处置的地方完成,并且由于内核也被处置,我确保下次使用同一个线程时,我们得到重新创建内核后的新上下文(至少我认为这是正在发生的事情)。

我的 Ninject 技能不是那么先进,关于如何解决这个问题的信息非常有限。我认为正确的方法是仅在 Main 中创建一个内核,然后能够通过构造函数将我需要的内容注入 BotService 对象。但同时需要为每个 Run() 创建 Context 以避免在我使用上述方法之一时会发生陈旧的上下文。

如何修改上面的示例以使其正确?我目前正在使用 Ninject 2.2.1.4。

0 投票
2 回答
4933 浏览

topshelf - Topshelf 多主机

topshelf 有没有办法在一个可执行文件中运行多个主机?

编辑

用线程解决。但不确定是否安全...

0 投票
1 回答
628 浏览

c# - 使用 Crontrigger 的非重复 Quartz 作业?

我有一个处理 Quartz Jobs 的 C# Topshelf windows Service。这些作业存储在数据库中,如下所示:

现在我必须添加一个只被解雇一次的工作(所有其他工作都必须重复)。我的(临时)解决方案是将 CronTrigger 字段保留为 NULL 并使用 SimpleTrigger 而不是 CronTrigger 开始这些作业,例如:

有没有更好的解决方案来做到这一点?换句话说:是否有一个 CronTrigger 允许您只开始一次工作并且从不重复它。

0 投票
3 回答
1661 浏览

c# - 强制 TopShelf 服务的单个实例

我正在使用 TopShelf 来托管我的 Windows 服务。这是我的设置代码:

我需要确保我的应用程序只有一个实例可以同时运行。目前,您可以将其作为 Windows 服务和任意数量的控制台应用程序同时启动。如果应用程序在启动期间检测到其他实例,它应该退出。

我真的很喜欢基于互斥锁的方法,但不知道如何使用 TopShelf。

0 投票
1 回答
1455 浏览

c# - Topshelf 服务/应用程序停留在“正在创建”

我正在尝试启动 Topshelf 的一个实例。我已经下载了 v. 2.3 的二进制文件并提取了所有内容。

然后我创建了一个空的控制台应用程序。我已将框架更改为.NET 4.0 framework并将以下代码添加到我的static void Main()方法中:

当我按 F5 时,consoleapp 按预期运行。

然后我将 bin/release 输出复制到 topshelf/services/test 目录并运行 Topshelf.Host.exe。这是结果: Topshelf 控制台输出

如果我将浏览器指向仪表板,这就是我所看到的: 顶级仪表板

“测试”服务一直说“正在创建”(等待超过 15 分钟)。

我究竟做错了什么?我尝试过多种控制台应用程序。如果我调用install我的控制台应用程序,该应用程序将成功注册。

提前致谢!

0 投票
2 回答
3674 浏览

c# - 使用 Topshelf 进行集成测试以启动 C# Windows 服务

我正在使用Topshelf托管用 C# 编写的 Windows 服务,现在我想编写一些集成测试。我的初始化代码保存在启动器类中,如下所示:

我想编写一些集成测试来确保 log4net 和 Ninject 设置正确并且 Topshelf 启动我的服务。问题是,一旦你调用Run()Topshelf 主机,代码就会阻塞,所以我的测试代码永远不会运行。

我想Launch()在我的测试部分调用一个单独的线程,SetUp但是我需要一些技巧来Thread.Sleep(1000)确保测试在Launch()完成之前不会运行。我无法在其上使用正确的同步(例如 a ManualResetEvent),因为它Launch()永远不会返回。当前代码是:

理想情况下,我正在寻找的是一种启动服务的非阻塞方式和一种再次停止它以放入我的TearDown. 目前我TearDown刚刚处理了发射器(所以从TearDown字面上撕下来!)。

有没有人以这种方式测试 Topshelf 服务的经验?我可以使用标准相对轻松地完成上述操作,ServiceHost但我更喜欢 Topshelf 中的显式配置和易于安装。