Итак, у меня есть служба Windows, написанная на C#. Класс службы происходит от ServiceBase
, а также запускает и останавливает методы экземпляров служебных вызовов OnStart
и OnStop
соответственно. Вот ВПЧЭ класса:Вызов ServiceBase.OnStart и OnStop ... тот же самый экземпляр?
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
.
Могу ли я быть уверенным, что это так?
Да, вы можете быть уверены. – zmbq
Положите это в ответ со ссылкой, и я передам вам очки! – spender
Ум. Вы действительно хотите сделать 'IsBackground = true'? Если вы вернетесь из 'OnStart', и будут выполняться только фоновые потоки, процесс может быть отключен - так что только удача/время (что этот поток уже сделал достаточный прогресс вперед для запуска« Сервера »), что служба остается наверху , –