如何使用 WhenCustomCommandReceived 设置 Topshelf?
How to setup Topshelf with WhenCustomCommandReceived?
我正在使用 Topshelf 创建一个 windows 服务 (ServiceClass),我正在考虑使用 WhenCustomCommandReceived 发送自定义命令。
HostFactory.Run(x =>
{
x.EnablePauseAndContinue();
x.Service<ServiceClass>(s =>
{
s.ConstructUsing(name => new ServiceClass(path));
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
s.WhenPaused(tc => tc.Pause());
s.WhenContinued(tc => tc.Resume());
s.WhenCustomCommandReceived(tc => tc.ExecuteCustomCommand());
});
x.RunAsLocalSystem();
x.SetDescription("Service Name");
x.SetDisplayName("Service Name");
x.SetServiceName("ServiceName");
x.StartAutomatically();
});
但是,我在 WhenCustomCommandReceived 行收到错误消息:
委托'Action< ServiceClass, HostControl, int>'不带1个参数
签名是
ServiceConfigurator<ServiceClass>.WhenCustomCommandReceived(Action<ServiceClass, HostControl, int> customCommandReceived)
我的 ServiceClass 中已经有启动、停止、暂停的方法:public void Start() 等。任何人都可以为我指出正确的方向来设置 Action 吗?谢谢!
因此,正如您在方法的签名中看到的那样,Action
接受三个参数,而不仅仅是一个。这意味着您需要这样设置:
s.WhenCustomCommandReceived((tc,hc,command) => tc.ExecuteCustomCommand());
在这种情况下,有趣的参数是 command
,类型为 int
。这是发送到服务的命令编号。
您可能想要更改 ExecuteCustomCommand
方法的签名以接受这样的命令:
s.WhenCustomCommandReceived((tc,hc,command) => tc.ExecuteCustomCommand(command));
并且在 ServiceClass
:
public void ExecuteCustomCommand(int command)
{
//Handle command
}
这允许您根据收到的命令采取不同的行动。
要测试向服务发送命令(从另一个 C# 项目),您可以使用以下代码:
ServiceController sc = new ServiceController("ServiceName"); //ServiceName is the name of the windows service
sc.ExecuteCommand(255); //Send command number 255
根据this MSDN reference,命令值必须在128到256之间。
请务必在您的测试项目中引用 System.ServiceProcess 程序集。
我正在使用 Topshelf 创建一个 windows 服务 (ServiceClass),我正在考虑使用 WhenCustomCommandReceived 发送自定义命令。
HostFactory.Run(x =>
{
x.EnablePauseAndContinue();
x.Service<ServiceClass>(s =>
{
s.ConstructUsing(name => new ServiceClass(path));
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
s.WhenPaused(tc => tc.Pause());
s.WhenContinued(tc => tc.Resume());
s.WhenCustomCommandReceived(tc => tc.ExecuteCustomCommand());
});
x.RunAsLocalSystem();
x.SetDescription("Service Name");
x.SetDisplayName("Service Name");
x.SetServiceName("ServiceName");
x.StartAutomatically();
});
但是,我在 WhenCustomCommandReceived 行收到错误消息:
委托'Action< ServiceClass, HostControl, int>'不带1个参数
签名是
ServiceConfigurator<ServiceClass>.WhenCustomCommandReceived(Action<ServiceClass, HostControl, int> customCommandReceived)
我的 ServiceClass 中已经有启动、停止、暂停的方法:public void Start() 等。任何人都可以为我指出正确的方向来设置 Action 吗?谢谢!
因此,正如您在方法的签名中看到的那样,Action
接受三个参数,而不仅仅是一个。这意味着您需要这样设置:
s.WhenCustomCommandReceived((tc,hc,command) => tc.ExecuteCustomCommand());
在这种情况下,有趣的参数是 command
,类型为 int
。这是发送到服务的命令编号。
您可能想要更改 ExecuteCustomCommand
方法的签名以接受这样的命令:
s.WhenCustomCommandReceived((tc,hc,command) => tc.ExecuteCustomCommand(command));
并且在 ServiceClass
:
public void ExecuteCustomCommand(int command)
{
//Handle command
}
这允许您根据收到的命令采取不同的行动。
要测试向服务发送命令(从另一个 C# 项目),您可以使用以下代码:
ServiceController sc = new ServiceController("ServiceName"); //ServiceName is the name of the windows service
sc.ExecuteCommand(255); //Send command number 255
根据this MSDN reference,命令值必须在128到256之间。
请务必在您的测试项目中引用 System.ServiceProcess 程序集。