Проверка времени службы Windows при выполнении HTTP-запросов

Я создал службу Windows, которая работает в фоновом режиме в течение длительного периода времени, снимая фото с веб-камеры каждые несколько секунд.

Моя проблема заключается в том, что служба Windows перестает работать (даже не называя метод OnStop) после отправки нескольких изображений в REST API с помощью System.Net.Http.HttpClient.

Фоновый процесс приостанавливается после нескольких вызовов API REST. Первые несколько вызовов работают нормально, но служба перестает работать.

Мой код выглядит примерно так:

protected override void OnStart(string[] args) 
{
    serviceIsRunning = true;
    thread = new Thread(Run);
    thread.Start();
}


 void Run() {
     while (serviceIsRunning)
     {
         Image image = Camera.CaptureImage();

         CallRestAPI(image);

         Thread.Sleep( (int) (1000 / framesPerSecond) );
     } 
 }

 HttpClient client = null;
 void CallRestAPI(Image image) 
 {
    if (client == null)
    {
        client = new HttpClient(); 
        client.DefaultRequestHeaders.Add("...", "..."); 
    }

    string requestParameters = "...";

    string uri = uriBase + "?" + requestParameters;

    // Request body. Posts a JPEG image.
    using (ByteArrayContent content = new ByteArrayContent(ImageToByteArray(image)))
    {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

        // Execute the REST API call.
        HttpResponseMessage response = client.PostAsync(uri, content).Result;

        // Get the JSON response.
        string contentString = response.Content.ReadAsStringAsync().Result;
    }   
 }

c#,.net,windows-services,

1

Ответов: 2


1 принят

Скорее всего, возникает необработанное исключение, что приведет к остановке процесса. Если вы хотите, чтобы служба продолжала работать, когда возникают прерывистые проблемы, вам необходимо поймать и обработать / обработать исключение:

void Run() {
     while (serviceIsRunning)
     {
     try {
         Image image = Camera.CaptureImage();

         CallRestAPI(image);

         Thread.Sleep( (int) (1000 / framesPerSecond) );
     }
     catch (Exception ex)
     {
         Log.Error(ex);
     }
     } 
}

(извините за форматирование, я пишу это по телефону)


1

Вероятно, он разбился. Вы заглянули в журнал событий? Вы регистрируете свой код (где-то)?

После того, как вы отлаживаете эту отладку, подумайте о том, как настроить службу для перезапуска после сбоя (но не обязательно попадать в аварийный, перезапуск, повторить цикл), настроив параметры «восстановления» для службы.

Обратите внимание, что в вашем описании говорится «делать фото с веб-камеры каждые несколько секунд», но ваш код говорит: Thread.Sleep( (int) (1000 / framesPerSecond) );

C # ,. чистые, окна-услуги,
Похожие вопросы