首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Topshelf根据自定义参数启动线程

Topshelf根据自定义参数启动线程
EN

Stack Overflow用户
提问于 2015-04-24 10:16:19
回答 2查看 1.4K关注 0票数 2

我已经做了一个使用自定义参数的topshelf服务:

代码语言:javascript
复制
string department = null;

// *********************Below is a TopShelf
HostFactory.Run(hostConfigurator =>
{
    //Define new parameter
    hostConfigurator.ApplyCommandLine();                                                
    //apply it  
    hostConfigurator.AddCommandLineDefinition("department", f => { department = f; });

    Helpers.LogFile("xxx", "Got department:"+department);  

    hostConfigurator.Service<MyService>(serviceConfigurator =>
    {
        //what service we are using
        serviceConfigurator.ConstructUsing(() => new MyService(department));
        //what to run on start
        serviceConfigurator.WhenStarted(myService => myService.Start());
        // and on stop             
        serviceConfigurator.WhenStopped(myService => myService.Stop());                 
    }

    hostConfigurator.RunAsLocalService();

    //****************Change those names for other
    string d = "CallForwardService_" + department;

    hostConfigurator.SetDisplayName(d);
    hostConfigurator.SetDescription("CallForward using Topshelf");
    hostConfigurator.SetServiceName(d);                
});



public class MyService
{
    string depTask;
    public MyService(string d)
    {
        //***********************Three tasks for three different destinations
        depTask = d;
        _taskL = new Task(Logistics);
        _taskP = new Task(Planners);
        _taskW = new Task(Workshop);
        Helpers.LogFile(depTask, "started working on threads for "+d);   

        public void Start()
        {
            if (depTask == "logistics")
            {
                _taskL.Start();
                Helpers.LogFile(depTask, "proper thread selected");      
            }
        }
    }
}

其中Helpers.logfile只是简单地写入文本文件。Aa您可以从上面的代码中看到,参数department被传递给MyService(string d)。当我使用"-department:workshop“作为调试参数进行调试时,一切都运行得很好。但是,当我尝试使用callforward.exe install -department:logistics将程序作为服务安装时,我确实创建了服务callforwardservice_logistics,但是当我检查日志时,该参数尚未传递给MyService。

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2015-04-24 15:47:38

似乎在默认情况下,Topshelf不支持向服务启动配置添加自定义参数,并且在安装后,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService下的ImagePath值不包含额外的参数-department:...。您可以继承默认的WindowsHostEnvironment并重载Install方法,但我认为将以下代码添加到您的主机配置代码中会更容易(可能不太好):

代码语言:javascript
复制
// *********************Below is a TopShelf code*****************************//
HostFactory.Run(hostConfigurator =>
{
    ...
    hc.AfterInstall(ihc =>
    {
        using (RegistryKey system = Registry.LocalMachine.OpenSubKey("System"))
        using (RegistryKey currentControlSet = system.OpenSubKey("CurrentControlSet"))
        using (RegistryKey services = currentControlSet.OpenSubKey("Services"))
        using (RegistryKey service = services.OpenSubKey(ihc.ServiceName, true))
        {
            const String v = "ImagePath";
            var imagePath = (String)service.GetValue(v);
            service.SetValue(v, imagePath + String.Format(" -department \"{0}\"", department));
        }
    });
    ...
}
票数 2
EN

Stack Overflow用户

发布于 2020-05-26 09:05:45

我最终解决了这个问题:仅设置参数是不够的,您还必须创建一个命名实例。

所以在我的情况下

代码语言:javascript
复制
callforward.exe install -department"logistics"

我用过

代码语言:javascript
复制
callforward.exe install -department"logistics" -instance:logistics

然后按实例名称启动实例:

代码语言:javascript
复制
net start CallForwardService_$logistics

这让我可以创建同一服务的多个实例,这些实例具有由参数控制的不同名称:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29837596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档