簡體   English   中英

VS C# tcp 服務器/偵聽器收到錯誤 1053 服務在作為 Windows 服務運行時沒有及時響應

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM