C# 将控制台应用程序转换为服务

标签 c# service console onstart

我正在尝试将控制台应用程序转换为 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);
  }
 }
}

最佳答案

MSDN documentation Windows 服务非常好,拥有您入门所需的一切。

您遇到的问题是因为您的 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(); 的调用,这将使调试变得更加容易。

如果您有其他要求,请编辑您的问题或发表评论。

关于C# 将控制台应用程序转换为服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19438408/

相关文章:

c# - 调用批处理文件后服务在 WaitForExit 处挂起

Android服务服务崩溃2次,停止: ServiceRecord

lua - 如何在Lua程序中清除控制台

c# - 如何在 C# 中将 char(10) [sql server] 替换为其他内容

c# - 如何在 C# Windows 窗体中将类对象更改为数组列表

service - 如何正确使用 OSGi getServiceReference()

c# - 我可以在 C# 中运行 adb shell 命令,并且在拔下 USB 电缆时不会中断它吗?

c# - 如何从 Windows Phone 8.1(不是 Silverlight)联系人获取生日

c# - 如何检查我是否有可以在 StreamReader 上阅读的内容?

macos - 如何在 Darwin/Mac 中清除控制台