1

我正在 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
        }
    }
}

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

4

3 回答 3

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 
        } 
    } 
} 
于 2012-10-02T13:34:52.080 回答
0

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

但是,代码有两个问题:

  1. 在 OnStart 中而不是在构造函数中启动线程,因为那是服务启动的时候。
  2. 包括一些停止函数的方式,例如布尔标志。
于 2012-10-02T13:35:34.677 回答
0

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

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

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

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

于 2012-10-02T13:40:39.753 回答