Обратный вызов OnStart()
должен возвращаться своевременно, поэтому вам захочется создать поток, в котором будет выполняться вся ваша работа.Я бы порекомендовал добавить в ваш класс следующие поля:
using System.Threading;
private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private Thread _thread;
Поле _thread
будет содержать ссылку на объект System.Threading.Thread
, который вы создаете в обратном вызове OnStart()
.Поле _shutdownEvent
содержит конструкцию события системного уровня, которая будет использоваться для подачи сигнала на прекращение работы потока при завершении работы службы.
В обратном вызове OnStart()
создайте и запустите поток.
protected override void OnStart(string[] args)
{
_thread = new Thread(WorkerThreadFunc);
_thread.Name = "My Worker Thread";
_thread.IsBackground = true;
_thread.Start();
}
Вам нужна функция с именем WorkerThreadFunc
, чтобы это работало.Он должен соответствовать подписи делегата System.Threading.ThreadStart
.
private void WorkerThreadFunc()
{
}
Если вы не включите в эту функцию что-либо, поток запустится, а затем сразу же закроется, так что вы получитеиспользовать некоторую логику, которая, в основном, поддерживает поток, пока вы выполняете свою работу.Это то место, где _shutdownEvent
пригодится.
private void WorkerThreadFunc()
{
while (!_shutdownEvent.WaitOne(0)) {
// Replace the Sleep() call with the work you need to do
Thread.Sleep(1000);
}
}
Цикл while проверяет ManualResetEvent
, чтобы определить, установлено оно или нет.Поскольку мы инициализировали объект с false
выше, эта проверка возвращает false.Внутри петли мы спим в течение 1 секунды.Вы захотите заменить это работой, которую вам нужно сделать - контролировать настройки прокси и т. Д.
Наконец, при обратном вызове OnStop()
вашей службы Windows вы хотите дать сигнал потоку прекратить работу.Это легко, используя _shutdownEvent
.
protected override void OnStop()
{
_shutdownEvent.Set();
if (!_thread.Join(3000)) { // give the thread 3 seconds to stop
_thread.Abort();
}
}
Надеюсь, это поможет.