我构建了一个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;
}
}
答案 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) );