【发布时间】:2012-05-29 22:14:09
【问题描述】:
所以我有一个用 c# 编写的 Windows 服务。服务类派生自ServiceBase,启动和停止服务分别调用实例方法OnStart和OnStop。这是该课程的 SSCE:
partial class CometService : ServiceBase
{
private Server<Bla> server;
private ManualResetEvent mre;
public CometService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//starting the server takes a while, but we need to complete quickly
//here so let's spin off a thread so we can return pronto.
new Thread(() =>
{
try
{
server = new Server<Bla>();
}
finally
{
mre.Set()
}
})
{
IsBackground = false
}.Start();
}
protected override void OnStop()
{
//ensure start logic is completed before continuing
mre.WaitOne();
server.Stop();
}
}
可以看出,有很多逻辑要求当我们调用OnStop 时,我们处理的ServiceBase 实例与调用OnStart 时相同。
我可以确定是这样吗?
【问题讨论】:
-
把它放在一个带有参考的答案中,我会给你积分!
-
嗯。你确定要
IsBackground = true吗?如果您从OnStart返回并且只有后台线程正在运行,则该进程可能会被关闭 - 所以只有运气/时机(该线程已经取得足够的前进进度来启动Server)服务才能保持正常运行. -
确实...实际上在实际代码中并不是这样,所以请忽略。不过会修正这个例子。
-
IsBackground = true 很好。该服务将保存在内存中,直到调用 OnStop - 这就是服务的含义。如果您的 OnStart 和 OnStop 方法为空,则该进程在启动时仍将保留在内存中。
标签: c# windows-services