微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在尝试将控制台应用程序转换为 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 documentation非常好,拥有入门所需的一切.

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

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

原文地址:https://www.jb51.cc/csharp/99202.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐