从.net的角度来看windows服务的体系结构

本文关键字:windows 服务 体系结构 net | 更新日期: 2023-09-27 18:13:14

多个windows服务可以共享一个进程。在c#中,它们将以:

开头
ServiceBase.Run(new MyService1(), new MyService2());

run方法的调用阻塞了main()执行的线程。同时处理服务的事件。那么他们在哪里被处决呢?

他们是否在"主"进程中使用异步过程调用,该进程不仅被阻塞,而且处于可报警等待状态?如果是这样,那么为多个服务共享一个进程在性能上就有缺点。处理程序是否在单独的线程中运行?它们是在包含Run()调用的进程之外执行的吗?

从.net的角度来看windows服务的体系结构

在Windows中,多个服务可以通过使用SERVICE_WIN32_SHARE_PROCESS服务类型来共享一个进程,. net必须使用此服务类型来在Windows的单个进程中注册多个服务。

每个注册的服务都有一个名称和一个本地入口点地址,由SERVICE_TABLE_ENTRY结构表示,. net将为每个传递给ServiceBase.Run方法的服务构造一个SERVICE_TABLE_ENTRY,并使用这些信息调用StartServiceCtrlDispatcher函数。

要接收关于服务状态的通知,入口点(ServiceMainServiceBase类实现)必须调用RegisterServiceCtrlHandlerEx来接收通知。这些通知是使用apc发送的。另外,NotifyServiceStatusChange API也使用apc。

您可能想了解的是windows服务体系结构以及服务应用程序如何集成在其中。

在MSDN中已经有一篇关于这个主题的非常好的文章,可以在这里找到。

它不仅解释了Windows如何与服务交互,服务数据库如何工作(至少部分)。

文章还解释了操作系统服务是如何工作的,并给出了一些关于在IIS (Internet信息服务)中托管服务的提示。