如何使用vs模板格式化Windows服务?

时间:2012-10-02 13:29:16

标签: c# multithreading visual-studio-2010 windows-services

我正在c#visual studio ultimate中创建一个Windows服务.. vs提供了一个模板,但我不知道我的代码放在哪里。有program.cs

static class Program
{
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1() 
        };
        ServiceBase.Run(ServicesToRun);
    }
}

和service1.cs示例代码显示了如何格式化它,但我不确定我正在做什么是正确的。香港专业教育学院搜索了相当多,但无法找到构建我的程序的方法

public partial class Service1 : ServiceBase
{
    Thread thread1;

    public Service1()
    {
        InitializeComponent();

        thread1 = new Thread(function);
        thread1.Start();
    }

    protected override void OnStart(string[] args)
    {
    }

    protected override void OnStop()
    {
    }

    public void function()
    {
        while (true)
        {
            //keep doing something
        }
    }
}

我在哪里调用循环函数?我放在哪里或从主要地方?

3 个答案:

答案 0 :(得分:0)

我看起来更像是这样:

public partial class Service1 : ServiceBase 
{ 
    Thread thread1; 
   Boolean running = false;

    public Service1() 
    { 
        InitializeComponent(); 

        thread1 = new Thread(function); 

    } 

    protected override void OnStart(string[] args) 
    { 
        thread1.Start(); 
        running = false;
    } 

    protected override void OnStop() 
    { 
        running = false;
        thread1.Stop(); 
    } 

    public void function() 
    { 
        while (running) 
        { 
            //keep doing something 
        } 
    } 
} 

答案 1 :(得分:0)

从技术上讲,将function()放入Service课程并没有错。在这一点上,这更像是一个设计问题。例如,function()与类中的其他操作类似吗?我猜不会,因为其他的涉及类和服务控制管理器(SCM)之间的交互。

但是,代码有两个问题:

  1. 在OnStart而不是在构造函数中启动线程,因为那是服务启动的时候。
  2. 包含一些停止函数的方法,例如bool标志。

答案 2 :(得分:0)

您应该记住,Service1的构造函数不仅会在通过SCM启动服务时执行 - 即使您在资源管理器中单击服务可执行文件也会执行它。

这就是为什么将任何服务有效负载放入ctor是一个坏主意 - 最好将服务初始化代码放入OnStart方法,并将最终化代码(例如,停止工作线程,清理资源) - 放入{{ 1}}方法。

请注意,OnStop / OnStart方法的执行时间非常有限 如果您计划执行繁重的初始化代码,请考虑使用延迟初始化,尽可能使用。

另外,请考虑使用OnStop / TPL而不是手动创建线程。