![](/img/trans.png)
[英]Error 1053: The service did not respond to the start or control request in a timely fashion, when intalled and ran a WCF service
[英]VS C# tcp server/listener gets error 1053 the service did not respond in a timly fashion when ran as a Windows Service
我有一個簡單的 TCP 服務器,使用 Visual Studio 用 C# 編寫。 除非作為 Windows 服務運行,否則一切正常,在該服務中出現 1053 錯誤。 我將其縮小到 TCP 偵聽器部分,因為當我將它們注釋掉時,服務啟動得很好。 這是我保留在 Service1.cs 中的代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.IO;
using System.Text.RegularExpressions;
namespace Vegas_Remote_Render_Server
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
var defaultwaittime = "20";
int defaultport = 1302;
TcpListener listener = new TcpListener(System.Net.IPAddress.Any, defaultport);
listener.Start();
while (true)
{
Console.WriteLine("Waiting for a connection.");
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Client accepted.");
NetworkStream stream = client.GetStream();
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
try
{
byte[] buffer = new byte[1024];
stream.Read(buffer, 0, buffer.Length);
int recv = 0;
foreach (byte b in buffer)
{
if (b != 0)
{
recv++;
}
}
string request = Encoding.UTF8.GetString(buffer, 0, recv);
string formattedrequest = Regex.Replace(request, @"^\s*$\n|\r", string.Empty, RegexOptions.Multiline).TrimEnd();
Console.WriteLine(request);
Console.WriteLine("request received");
sw.WriteLine("request received");
string[] splitrequest = request.Split('|');
var projectpath = "";
var parameternumber = 0;
var waittime = defaultwaittime;
foreach (string value in splitrequest)
{
parameternumber = parameternumber + 1;
if (parameternumber == 1)
{
projectpath = value;
}
if (parameternumber == 2)
{
waittime = value;
}
}
if (formattedrequest != "killrender")
{
Console.WriteLine(projectpath);
Console.WriteLine(waittime);
System.Diagnostics.Process.Start(@"render.bat", $"\"{projectpath}\" \"{waittime}\"");
sw.Flush();
}
if (formattedrequest == "killrender")
{
Console.WriteLine("killing instances");
System.Diagnostics.Process.Start(@"kill.bat");
}
}
catch (Exception e)
{
Console.WriteLine("Something went wrong.");
sw.WriteLine(e.ToString());
}
}
}
protected override void OnStop()
{
}
}
}
為了簡化腳本,這里只列出 TCP 監聽部分:
static void Main(string[] args)
{
TcpListener listener = new TcpListener(System.Net.IPAddress.Any, defaultport);
listener.Start();
while (true)
{
TcpClient client = listener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
}
}
我還在其他帖子中嘗試了許多關於該服務問題的解決方案。 這包括將 .exe 從 Visual Studio 導出為 Release 而不是 Debug,注釋我在調試時使用的 console.WriteLine 命令,以及刪除 while(true)。 我的 Visual Studio 項目也使用項目模板“Windows Service C#”
我聽說您可以進行注冊表編輯以給服務更多時間,但我寧願不使用該解決方案。 該服務在被視為“無響應”之前的一段時間內有效。 我一直試圖找到 TCP 監聽器的哪一部分正在這樣做。
在此先感謝,我仍然是 C# 的新手
1053 錯誤狀態:
服務未及時響應啟動或控制請求。
此錯誤消息是在發起請求以啟動服務后發生超時但在 window 時間內沒有響應的原因。
您的情況的響應是退出OnStart()
方法。 您使用while(true)
,這在許多情況下很容易出錯。 我懷疑您的服務只是進入循環並退出,因為AcceptTcpClient 是!阻塞! 操作:
AcceptTcpClient 是一種阻塞方法,它返回可用於發送和接收數據的 TcpClient。 如果要避免阻塞,請使用 Pending 方法確定傳入連接隊列中的連接請求是否可用。
您需要將處理客戶端的例程移出OnStart
方法以不阻塞它,只需將其移至單獨的線程即可。
不要忘記在服務停止時Stop() TcpListener 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.