![](/img/trans.png)
[英]Multithreaded console application that runs as windows service (using Topshelf)
[英]Installing a Topshelf application as a Windows service
使用Visual Studio Express 2012,我使用Topshelf(版本3.1.107.0)创建了一个控制台应用程序。 该应用程序作为控制台应用程序,但我无法弄清楚如何将其作为服务安装。 我从Visual Studio(Build,Publish)中发布了该项目,以管理员身份启动了命令提示符,导航到发布应用程序的文件夹,然后从命令提示符运行setup.exe -install。 应用程序已安装并运行,但作为控制台应用程序,而不是Windows服务。 我在这里错过了什么?
对于那些可能不熟悉Topshelf的人来说,它是.Net的Windows服务框架,应该促进我上面描述的场景 - 开发和调试作为控制台应用程序,部署为Windows服务。 请参阅http://docs.topshelf-project.com/en/latest/index.html上的文档。
运行service.exe install
以安装该服务。
有关更多信息,请参阅Topshelf命令行参考文档。
cmd.exe
导航控制台到
.\\myConsoleApplication\\bin\\Release\\
运行命令
.\\myConsoleApplication.exe install
运行命令
.\\myConsoleApplication.exe start
码:
using System;
using System.Threading;
using Topshelf;
using Topshelf.Runtime;
namespace MyConsoleApplication
{
public class MyService
{
public MyService(HostSettings settings)
{
}
private SemaphoreSlim _semaphoreToRequestStop;
private Thread _thread;
public void Start()
{
_semaphoreToRequestStop = new SemaphoreSlim(0);
_thread = new Thread(DoWork);
_thread.Start();
}
public void Stop()
{
_semaphoreToRequestStop.Release();
_thread.Join();
}
private void DoWork()
{
while (true)
{
Console.WriteLine("doing work..");
if (_semaphoreToRequestStop.Wait(500))
{
Console.WriteLine("Stopped");
break;
}
}
}
}
public class Program
{
public static void Main()
{
HostFactory.Run(x =>
{
x.StartAutomatically(); // Start the service automatically
x.EnableServiceRecovery(rc =>
{
rc.RestartService(1); // restart the service after 1 minute
});
x.Service<MyService>(s =>
{
s.ConstructUsing(hostSettings => new MyService(hostSettings));
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("MyDescription");
x.SetDisplayName("MyDisplayName");
x.SetServiceName("MyServiceName");
});
}
}
}
浏览到该文件夹并运行命令:
AppName.exe install
您必须以管理员身份运行命令提示符。
所以这是一个老问题,但我想添加一些命令行选项。
MyTopShelfImplementation.exe安装-servicename“MyServiceName”-displayname“我的显示名称”--autostart start
。
- 自动开启
适用于Windows重启的时间。
开始
用于安装后立即启动服务
现在,你也可以在代码中指定“名称”
HostFactory.Run(x =>
{
////x.SetDescription("My Description");
x.SetDisplayName("My Display Name");
x.SetServiceName("My Service Name");
////x.SetInstanceName("My Instance");
因此,如果.exe作为控制台应用程序(或作为Windows服务)运行,可能是在代码中设置这些值和/或通过命令行传递它们的某种组合。
我希望如果你没有在代码中设置“名称”并且你没有通过命令行参数传递“名称”,那么你将获得控制台行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.