2013-04-12 5 views
5

У меня есть служба Windows, и я написал код для выполнения задачи в случае OnStart():Как запустить задачу при запуске службы Windows?

protected override void OnStart(string[] args) 
     { 
      this.DoTask(); 
     } 

private void DoTask() 
     { 
      Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()); 

      try 
      { 
       Task.Wait(task1); 
      } 
      catch (Exception ex) 
      { 
       this.Log.Error("Failed running the task", ex); 
      }   
     } 

Выполнитезадачи это нескончаемый цикл. Он останавливается только тогда, когда служба остановлена.

Но когда я пытаюсь запустить службу, он ждет много времени, а затем дает мне ошибку ниже:

Windows could not start the ... service on Local Computer. 
Error 1053: The service did not respond to the start or control request in a timely fashion. 

Как решить это?

ответ

7

Почему вы ожидали, что ваша задача будет завершена?

Я думаю, что Task.Wait блокирует ваш текущий поток, тогда вы получаете таймаут при запуске службы.

EDIT: Вы должны удалить этот блок:

try 
{ 
    Task.Wait(task1); 
} 
catch (Exception ex) 
{ 
    this.Log.Error("Failed running the task", ex); 
} 

Task.Wait действительно блокирует текущий поток. По MSDN:

Task.Wait Method

Waits for the Task to complete execution.

EDIT 2 ли это вместо

Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()).ContinueWith(t => 
{ 
    var aggException = t.Exception.Flatten(); 
    foreach(var ex in aggException.InnerExceptions) 
     this.Log.Error("Failed running the task", ex); 
}, 
TaskContinuationOptions.OnlyOnFaulted); 
+0

Ожидание не ожидается. Я имею в виду, что он просто фиксирует любые исключения из этой задачи. –

+0

Ожидание * * «Ожидание как таковое». Ваш код сидит там, ничего не делая, ожидая завершения этой задачи. И он делает это ожидание в том же потоке, который называется «OnStart». –

+0

нет. он используется для захвата исключения. –

1

В цикле вы должны проверить, «статус остановки» остановлен и выйти из цикла. У вас есть 5 секунд, чтобы сделать это до того, как ОС решит вас убить.

1

Я предполагаю, что это, потому что вы ждете OriginalFileProcessor.StartPolling() до конца, но это никогда не случится. Вы должны перенести свой экземпляр задачи в отдельного члена и не дожидаться его завершения:

private Task m_task = null; 

private void DoTask() 
{ 
    try 
    { 
     m_task = Task.Factory.StartNew(() => this.StartPolling()); 
    } 
    catch 
    { 
     this.Log.Error("Unable to start task", ex); 
     throw; // Rethrow, so that the OS knows, there was something wrong. 
    }   
} 

private void StartPolling() 
{ 
    try 
    { 
     this.OriginalFileProcessor.StartPolling(); 
    } 
    catch (Exception ex) 
    { 
     this.Log.Error("Failed running the task", ex); 
    } 
} 
+0

ваш улов никогда не ловит. Он может ловить только когда вы ждете его. –

+0

@ TheLight: он должен извлекать исключения из ['Task.Factory.StartNew'] (http://msdn.microsoft.com/en-us/library/dd321439.aspx), а не из' StartPolling'. Вы запускаете службу для запуска async, не дожидаясь ее завершения. Обновлен ответ. – Carsten

+0

Task.Factory.StartNew не возвращает исключение. Вы можете зафиксировать исключение, ожидая выполнения задачи. или есть другой способ? –

Смежные вопросы