我正在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
}
}
}
我在哪里调用循环函数?我放在哪里或从主要地方?
答案 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)之间的交互。
但是,代码有两个问题:
答案 2 :(得分:0)
您应该记住,Service1
的构造函数不仅会在通过SCM启动服务时执行 - 即使您在资源管理器中单击服务可执行文件也会执行它。
这就是为什么将任何服务有效负载放入ctor是一个坏主意 - 最好将服务初始化代码放入OnStart
方法,并将最终化代码(例如,停止工作线程,清理资源) - 放入{{ 1}}方法。
请注意,OnStop
/ OnStart
方法的执行时间非常有限
如果您计划执行繁重的初始化代码,请考虑使用延迟初始化,尽可能使用。
另外,请考虑使用OnStop
/ TPL而不是手动创建线程。