发出http请求时的Windows服务计时

时间:2018-07-06 21:26:51

标签: c# .net windows-services

我构建了一个Windows服务,该服务长时间在后台运行,每隔几秒钟从网络摄像头拍摄一张照片。

我的问题是,使用System.Net.Http.HttpClient将一些图像发布到REST API之后,Windows服务停止运行(甚至不调用OnStop方法)。

几次调用REST API后,后台进程挂起。前几个调用工作正常,但是该服务停止运行。

我的代码是这样的:

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;
    }   
 }

2 个答案:

答案 0 :(得分:1)

最有可能引发了未处理的异常,这将导致进程停止。如果您希望服务在出现间歇性问题时继续运行,则需要捕获并记录/处理异常:

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

         CallRestAPI(image);

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

(对不起格式,我正在手机上写)

答案 1 :(得分:1)

它可能崩溃了。您是否查看了事件日志?您是否在代码中进行任何登录(到某处)?

一旦调试完毕,请考虑为服务配置"recovery" options,以将服务配置为在崩溃后重新启动(但请确保不会崩溃,重新启动,重复循环)。

请注意,您的描述为“每隔几秒钟从网络摄像头拍照”,但您的代码显示为:Thread.Sleep( (int) (1000 / framesPerSecond) );