多个windows服务可以共享一个进程。在 C# 中,它们将开始为:
ServiceBase.Run(new MyService1(), new MyService2());
run 方法的调用会阻塞main()
执行的线程。同时处理服务事件。那么他们在哪里被执行?
他们是否在“主”进程中使用异步过程调用,不仅被阻止而且处于可警告等待状态?如果是这样,多个服务共享一个进程在性能上是有缺陷的。处理程序是否在单独的线程中运行?它们是否在包含 Run()
调用的进程之外执行?
最佳答案
在 Windows 中,多个服务可以通过使用 SERVICE_WIN32_SHARE_PROCESS 共享一个进程服务类型。 .NET 必须使用此服务类型在 Windows 上的单个进程中注册多个服务。
每个注册服务都有一个名称和一个本地入口点地址,由 SERVICE_TABLE_ENTRY 表示结构体。 .NET 应为传递给 ServiceBase.Run
方法的每个服务构造一个 SERVICE_TABLE_ENTRY
,并使用这些信息调用 StartServiceCtrlDispatcher
函数。
要接收有关服务状态的通知,入口点(ServiceMain
由 ServiceBase
类实现)必须调用 RegisterServiceCtrlHandlerEx接收通知。这些通知是使用 APC 发送的。作为旁注,NotifyServiceStatusChange API 也使用 APC。
关于c# - 从 .Net 的角度看 Windows 服务的体系结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778987/