gpt4 book ai didi

c# - 同一应用程序的多个实例作为 Windows 服务?

转载 作者:太空狗 更新时间:2023-10-29 20:26:07 31 4
gpt4 key购买 nike

我有一个管理项目繁重处理的应用程序,需要将其转换为“Windows 服务”。我需要允许运行应用程序处理的多个 versions 实例,这似乎是一个相当正常的要求。

我至少可以看到三种方法:

  1. 创建一个安装目录(EXE、DLL、配置),但从中安装多个服务实例。
  2. 让一个服务实例在启动后产生多个自身实例,就像 Apache 一样。
  3. 让单个Services 实例产生多个在同一进程空间内工作的线程。

我的意图是方法 #1,但我一直被限制绊倒,无论是在设计方面,还是在服务的文档方面:

  • 参数是否曾经通过无人值守系统上的正常服务机制传递给OnStart()?如果是,什么时候/为什么?
  • 通过 ImageKey 注册表传递运行时参数似乎很麻烦,有没有更好的机制?
  • 我让应用程序将自身安装/卸载为一对服务(“XYZ #1”、“XYZ #2”、...),使用 ImageKey 向其发送命令行参数实例编号(“-x 1”,“-x 2”)但我遗漏了一些东西。尝试启动该服务时,它会失败并显示“该服务配置为在其中运行的可执行程序未实现该服务

那么,问题:

  1. 是否有关于服务启动时发生的情况的简明描述,特别是对于 ServiceName 不是硬编码的情况(参见上面的问题)。
  2. 有没有人成功使用方法 1?有什么意见吗?

注意:我已经使用方法 #3 回避了这个问题,所以我没有理由花太多时间来解决这个问题。但我认为有人可能知道如何实现 #1 - 或者这不是一个好主意的充分理由。

[编辑] 我最初有第四个选项(在硬盘驱动器上安装应用程序的多个副本)但我删除了它,因为它感觉,嗯,hackish .这就是为什么我说“至少三种方法”。

但是,除非重新编译应用程序,否则它必须动态设置其服务名称,因此可以解决上述第三个项目符号/问题。因此,除非一个实例需要更改它的安装文件,#1 应该可以很好地处理目录中的 N 个配置文件和一个指示该实例应该使用的注册表项。

最佳答案

虽然我无法回答您针对选项 #1 的具体问题,但我可以告诉您选项 #2 对我们非常有效。我们想为每个“子”服务创建一个应用程序域以在其下运行,并且每个子服务都使用不同的配置文件。在我们服务的配置文件中,我们存储了要启动的应用程序域和要使用的配置文件。因此,对于每个条目,我们只需创建应用程序域、设置配置文件等,然后我们就可以开始了。这种配置分离使我们能够轻松地为每个实例指定唯一的端口和日志文件位置。对我们的额外好处是,我们将“子服务”编写为命令行 exe,并在每个“子”服务的新线程上简单地调用 AppDomain 的 ExecuteAssembly()。解决方案中唯一的“笨拙”是关闭,我们没有费心为它创建一个“好的”解决方案。

2012 年 2 月更新

前段时间我们开始使用“命名”服务(如 SQL Server)。我在我的博客“构建 Windows 服务 – Part 1Part 7”系列中详细介绍了整个过程。他们将带您创建一个命令行/Windows 服务混合体并完成 self 安装。实现了以下目标:

  • 构建也可以从控制台使用的服务
  • 服务启动/关闭和其他事件的正确事件记录
  • 使用命令行参数允许多个实例
  • 自行安装服务和事件日志
  • 正确记录服务异常和错误的事件
  • 控制启动、关闭和重启选项
  • 处理自定义服务命令、电源和 session 事件
  • 自定义服务安全和访问控制

本系列的最后一篇文章中提供了完整的 Visual Studio 项目模板 Building a Windows Service – Part 7: Finishing touches .

关于c# - 同一应用程序的多个实例作为 Windows 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1370539/

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