c# - 从 .Net 的角度看 Windows 服务的体系结构

标签 c# .net windows winapi service

多个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 函数。

要接收有关服务状态的通知,入口点(ServiceMainServiceBase 类实现)必须调用 RegisterServiceCtrlHandlerEx接收通知。这些通知是使用 APC 发送的。作为旁注,NotifyServiceStatusChange API 也使用 APC。

关于c# - 从 .Net 的角度看 Windows 服务的体系结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778987/

相关文章:

javascript - 检测从网站安装的软件

C# 如何创建类的特殊实例?

.net - 默认情况下如何拒绝对 Web API 项目的授权

.net - Entity Framework 中的 Create<Object> 与 new <Object>

windows - 从命令行获取默认打印机名称?

python - 在 Windows 中关闭 Python 中的主程序时,通过子进程传递参数并终止子进程

c# - GetPathByAction 为 Dictionary<string,string> 创建错误的查询参数

c# - .NET 和 C# 的初学者书籍?

c# - 获取本地组而不是域用户的主要组

python - 如何将 Python DataFrame 传递到 UiPath?