Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否将同一应用程序的多个实例作为Windows服务?_C#_Windows Services - Fatal编程技术网

C# 是否将同一应用程序的多个实例作为Windows服务?

C# 是否将同一应用程序的多个实例作为Windows服务?,c#,windows-services,C#,Windows Services,我有一个管理我的项目繁重处理的应用程序,需要将其转换为“Windows服务”。我需要允许运行应用程序处理的多个版本实例,这似乎是一个相当正常的要求 我认为至少有三种方法可以做到这一点: 创建单个已安装目录(EXE、DLL、config),但从中作为多个服务实例安装 让一个服务实例在启动后生成多个实例,一个la Apache 让单个服务实例生成在同一进程空间中工作的多个线程 我的意图是方法#1,但我一直被设计和服务文档方面的限制绊倒: 无人值守系统上的正常服务机制是否曾将参数传递给OnStart

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

我认为至少有三种方法可以做到这一点:

  • 创建单个已安装目录(EXE、DLL、config),但从中作为多个服务实例安装
  • 让一个服务实例在启动后生成多个实例,一个la Apache
  • 让单个服务实例生成在同一进程空间中工作的多个线程
  • 我的意图是方法#1,但我一直被设计和服务文档方面的限制绊倒:

    • 无人值守系统上的正常服务机制是否曾将参数传递给OnStart()?如果是,何时/为什么
    • 通过ImageKey注册表传递运行时参数似乎是个难题,有更好的机制吗
    • 我让应用程序作为一对服务(“XYZ#1”、“XYZ#2”,…)来安装/卸载自己,使用ImageKey将命令行参数实例号(“-x1”、“-x2”)交给它,但我遗漏了一些东西。当尝试启动服务时,它将失败,并显示“此服务配置为在其中运行的可执行程序未实现该服务
    因此,问题是:

  • 是否有一个简明的描述,说明服务启动时会发生什么,特别是对于那些ServiceName没有硬编码的情况(参见上面的Q)
  • 有人成功地使用了方法1吗?有什么评论吗
  • 注意:我使用了方法#3来回避这个问题,所以我无法证明有多少时间来解决这个问题。但我认为有人可能知道如何实现#1,或者有充分的理由说明这不是一个好主意

    [编辑]我最初有第四种选择(在硬盘上安装应用程序的多个副本),但我删除了它,因为它让人觉得,嗯,有点黑客味。这就是为什么我说“至少有三种方法”


    但是,除非重新编译应用程序,否则它必须动态设置其ServiceName,因此这就有了上述第三个项目符号/问题的解决方案。因此,除非实例需要更改其安装文件,否则#1应该可以与目录中的N个配置文件以及指示该实例应使用的注册表项配合使用。

    尽管我无法确定回答您关于选项1的问题,我可以告诉您,选项2对我们来说非常有效。我们希望为每个“子”服务创建一个应用程序域以运行,并让每个“子”服务使用不同的配置文件。在我们服务的配置文件中,我们存储了要启动的应用程序域和要使用的配置文件。因此,对于每个条目我们只是创建了应用程序域,设置了配置文件等,然后就开始了。这种配置分离使我们能够轻松地为每个实例指定唯一的端口和日志文件位置。我们的另一个好处是,我们将“子服务”编写为命令行exe,并简单地称为AppDomain的ExecuteAssembly()在每个“子”服务的新线程上。解决方案中唯一的“笨拙”是关机,我们没有为它创建一个“好”的解决方案

    2012年2月更新

    不久前,我们开始使用“命名”服务(如SQL Server)。我在我的博客上的“构建Windows服务–通过”系列中详细介绍了整个过程。它们将引导您创建一个命令行/Windows服务混合体,并完成自安装。实现了以下目标:

    • 构建也可以从控制台使用的服务
    • 正确记录服务启动/关闭和其他活动的事件
    • 通过使用命令行参数允许多个实例
    • 自安装服务和事件日志
    • 正确记录服务异常和错误的事件
    • 控制启动、关闭和重启选项
    • 处理自定义服务命令、电源和会话事件
    • 定制服务安全和访问控制
    在本系列的最后一篇文章中提供了一个完整的Visual Studio项目模板。

    请查看:

    我在项目中成功地使用了选项4,即“命名实例”


    您的应用程序的每个安装都有自定义名称,每个安装都有自己的服务。它们完全独立,彼此独立。如果您尝试在一台计算机上多次安装,MS SQL Server将使用此模式。

    这就是“多次安装应用程序”“解决方案。实际上,这不仅仅是添加服务实例,而是添加每个具有不同ServiceName的安装。但由于这种方法解决了我遇到的“动态设置ServiceName”问题,这意味着#1可以完成。然而,在我看来#1会更容易(如果只对最终用户来说)——只需安装一次文件/包,然后从中安装多个服务。假设这些实例不需要在安装目录中的文件之间有很大的差异,我知道,但是您说您需要更多的服务,因为您的应用程序可能有多个版本。为什么要将所有版本转储到一个文件夹中使事情变得复杂。如果你假设你的所有版本将来都与你的单个安装目录中的内容兼容,那么继续下去,但是在软件开发中假设某些东西是不安全的,除非它是基于一些坚实的数学基础,而不是这样的:对不起,把你弄糊涂了,我有一个拼写错误:我指的是同一版本的多个实例,而不是我最初所说的“多个版本”。永远不会安装多个版本。