用于数据库的Windows服务的基类

时间:2014-07-17 16:40:20

标签: c# base-class

我正在尝试为Windows服务创建一个基类,以便在部署到不同的数据库时尽可能少地进行更改。我有这个,但有一个未处理的例外:

  

“> Microsoft.VisualStudio.HostingProcess.Utilities.dll”中发生了'System.StackOverflowException'类型的未处理异常,

我是服务新手,所以我可以完全放弃,到目前为止,这就是我所拥有的:

public partial class Service1 : ServiceBase
{
     namespace SecureVoiceBase
      {
           public Service1()
           {

              try
              {

                  InitializeComponent();
              }
              catch (Exception e)
              {
                  EventLog.WriteEntry(e.Message);
              }
           }
        protected override void OnStart(string[] args)
        {
            //code here
        }
         //OnStop, Timers as well...
     }
 }

public class Version_10 : ServiceBase// Derived class, This is where I will call      
{
    //certain methods depending on which database I will use  
    Version_10 set = new Version_10();

    public void Start(string[] args)
    {
        set.OnStart(args);
    }
 }

这是我的Program.cs:

   namespace testservice
   {
      static class Program
      {
         /// <summary>
         /// The main entry point for the application.
         /// </summary>

         static void Main(params string[] args)
         {
             var service = new Version_10();
             if (!Environment.UserInteractive)
             {
                var servicesToRun = new ServiceBase[] { service };
                ServiceBase.Run(servicesToRun);
                return;
             }

        Console.WriteLine("Running as a Console Application");
        Console.WriteLine(" 1. Run Service");
        Console.WriteLine(" 2. Other Option");
        Console.WriteLine(" 3. Exit");
        Console.Write("Enter Option: ");
        var input = Console.ReadLine();

        switch (input)
        {
            case "1":
                service.Start(args);
                Console.WriteLine("Running Service - Press Enter To Exit");
                Console.ReadLine();
                break;

            case "2":
                // TODO!
                break;
        }

        Console.WriteLine("Closing");
    }

     //  ServiceBase[] ServicesToRun;
     //  ServicesToRun = new ServiceBase[] 
     //  { 
     //       new Version_10()
     //  };
     //  ServiceBase.Run(ServicesToRun);

   }
}

通常我会使用其他方法,但我认为这只会浪费空间。我完全不参加基础课吗?

3 个答案:

答案 0 :(得分:1)

你的问题在于:

public class Version_10 : ServiceBase
{
    Version_10 set = new Version_10(); // <-- Recursive call on object construct

它与服务或任何东西无关。您的代码具有递归调用,并触发StackOverflow异常。

<强>更新

要解决您的问题,请将您的Version_10课程更改为:

public class Version_10 : ServiceBase
{
    public void Start(string[] args)
    {
        this.OnStart(args);
    }
}

答案 1 :(得分:0)

这部分是递归的,这就是你得到System.StackOverflowException的原因。

public class Version_10 : ServiceBase
{
    **Version_10 set = new Version_10();**


    public void Start(string[] args)
    {
        set.OnStart(args);
    }
 }

也许你应该查看一些文章:

A basic Windows service in C#

答案 2 :(得分:0)

由于这个问题,您将收到Stack Overflow异常:

public class Version_10 : ServiceBase
{
    Version_10 set = new Version_10();
}

当您创建Version_10的实例时,它会创建Version_10的实例,该实例会创建Version_10的实例,该实例会创建Version_10的实例,该实例会创建{的实例{1}}创建Version_10等的实例....