C# 将控制台应用转换为服务
本文关键字:服务 转换 应用 控制台 | 更新日期: 2023-09-27 18:35:55
我正在尝试将控制台应用程序转换为Windows服务。我正在尝试让服务的 onstart 方法调用我类中的方法,但我似乎无法让它工作。我不确定我是否正确执行此操作。将类信息放在服务中的什么位置
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("my service started");
Debugger.Launch();
Program pgrm = new Program();
pgrm.Run();
}
从评论:
namespace MyService {
static class serviceProgram {
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main() {
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] {
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
}
}
关于Windows服务的MSDN文档非常好,并且具有入门所需的一切。
您遇到的问题是因为您的 OnStart 实现,它只应该用于设置服务,以便它准备好启动,该方法必须立即返回。通常,您会在另一个线程或计时器上运行大部分代码。请参阅 OnStart 页面进行确认。
编辑:如果不知道您的 Windows 服务将做什么,就很难告诉您如何实现它,但假设您想在服务运行时每 10 秒运行一次方法:
public partial class Service1 : ServiceBase
{
private System.Timers.Timer _timer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
#if DEBUG
System.Diagnostics.Debugger.Launch(); // This will automatically prompt to attach the debugger if you are in Debug configuration
#endif
_timer = new System.Timers.Timer(10 * 1000); //10 seconds
_timer.Elapsed += TimerOnElapsed;
_timer.Start();
}
private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
// Call to run off to a database or do some processing
}
protected override void OnStop()
{
_timer.Stop();
_timer.Elapsed -= TimerOnElapsed;
}
}
在这里,OnStart
方法在设置计时器后立即返回,TimerOnElapsed
将在工作线程上运行。我还添加了对System.Diagnostics.Debugger.Launch();
的调用,这将使调试变得更加容易。
如果您有其他要求,请编辑您的问题或发表评论。
帮自己最大的忙,并使用顶级 http://topshelf-project.com/来创建您的服务。没有什么比我看到的更容易了。他们的文档是 supperb 并且部署再简单不过了。c:/服务路径/服务.exe安装。