2012-05-29 3 views
1

Итак, у меня есть служба 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.

Могу ли я быть уверенным, что это так?

+1

Да, вы можете быть уверены. – zmbq

+0

Положите это в ответ со ссылкой, и я передам вам очки! – spender

+0

Ум. Вы действительно хотите сделать 'IsBackground = true'? Если вы вернетесь из 'OnStart', и будут выполняться только фоновые потоки, процесс может быть отключен - так что только удача/время (что этот поток уже сделал достаточный прогресс вперед для запуска« Сервера »), что служба остается наверху , –

ответ

2

Если вы смотрите в Program.cs классе, вы увидите код вроде следующего:

private static void Main() 
{ 
    ServiceBase.Run(new ServiceBase[] 
       { 
        new CometService() 
       }); 
} 

То есть, экземпляр создается кодом в собственном проекте. Это один экземпляр, который вызывает все вызовы Service Manager (включая OnStart и OnStop).

1

Я думаю, это тот же пример. Вы можете выполнить быстрый тест, добавив статическое поле в класс, чтобы отслеживать ссылку на объект, используемый в OnStart, и сравнивать его с экземпляром OnStop.

private static CometService instance = null; 

protected override void OnStart(...) 
{ 
    instance = this; 
    ... 
} 

protected override void OnStop() 
{ 
    object.ReferenceEquals(this, instance); 
    ... 
} 
Смежные вопросы