Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 超时后重新连接到TCP客户端_C#_Tcp_Backgroundworker_Tcpclient - Fatal编程技术网

C# 超时后重新连接到TCP客户端

C# 超时后重新连接到TCP客户端,c#,tcp,backgroundworker,tcpclient,C#,Tcp,Backgroundworker,Tcpclient,我刚刚完成了一个自动滑动门的编程,它是通过C#中的一个应用程序控制的。应用程序通过TCP/IP以太网与移动门的电机通信。我现在要做另一个版本,可以同时控制两扇门。我立即遇到了一个问题,如果我同时发送命令,我尝试与之通信的第二个电机将立即断开。我主要通过设置两个后台工作人员来解决这个问题。每个工人从每个马达每个循环加载所有必要的变量,并发送当前排队的任何命令。不幸的是,电机偶尔会出现指令溢出和连接松动的情况。发生这种情况时,我无法重新连接。 以下是我发送电机指令的功能: public string

我刚刚完成了一个自动滑动门的编程,它是通过C#中的一个应用程序控制的。应用程序通过TCP/IP以太网与移动门的电机通信。我现在要做另一个版本,可以同时控制两扇门。我立即遇到了一个问题,如果我同时发送命令,我尝试与之通信的第二个电机将立即断开。我主要通过设置两个后台工作人员来解决这个问题。每个工人从每个马达每个循环加载所有必要的变量,并发送当前排队的任何命令。不幸的是,电机偶尔会出现指令溢出和连接松动的情况。发生这种情况时,我无法重新连接。 以下是我发送电机指令的功能:

public string[] SendMotorCommand(string motorCommand, bool timeout = true, int timeoutMS = 2000)
    {
        string[] messagesReceived = null;
        if (connected)
        {
            try
            {
                //example from: http://stackoverflow.com/questions/10182751/server-client-send-receive-simple-text

                //---create a TCPClient object at the IP and port no.---
                NetworkStream nwStream = Client.GetStream();
                if (timeout)
                    nwStream.ReadTimeout = timeoutMS;
                else
                    nwStream.ReadTimeout = -1;
                byte[] bytesToSend = Encoding.ASCII.GetBytes(motorCommand + "\r");
                nwStream.Write(bytesToSend, 0, bytesToSend.Length);
                /*if (motorCommand.Contains("PR"))
                {*/
                    //---read back the text---

                    byte[] data = new byte[Client.ReceiveBufferSize];

                    int bytesRead = nwStream.Read(data, 0, data.Length);

                    string str = Encoding.ASCII.GetString(data, 0, bytesRead).Trim();

                    messagesReceived = str.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
                //}
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Failed to send or receive command " + motorCommand + " at IP " + ip);
                Debug.WriteLine(ex);
                Client.Close();
                Client = new TcpClient();
                Client.Connect(ip, 503);

            }
        }
        return (messagesReceived);
    }
如您所见,如果电机无法通信,我将关闭当前客户端并再次创建它,但是,在初始通信失败后,我永远无法重新连接。我能让他们重新工作的唯一方法是重新启动应用程序。以太网连接没有任何变化,这一事实让我认为,如果连接失败,我应该能够可靠地重新建立连接


其中大约有20个命令在循环中运行,但也有可能有许多命令排队,特别是如果命令一直超时的话。有没有可能一堆命令正在排队,而这些命令仍在由以太网接口处理?作为一个临时修复,我将我的应用程序设置为在命令失败时自动重新启动,当发生这种情况时,它通常会重新启动几次,然后再继续。这让我觉得仍有一些事情正在处理。

看起来这是我的命令队列的问题

以下是我的命令的发送方式:

string[] currentCommands = commands.ToArray();
                commands.Clear();

                foreach (string command in currentCommands)
                {
                    SendMotorCommand(command);
                }
它看起来像是随机的,这个字符是作为命令()发送的,不知道如何显示它,但它看起来像是一个小L,更高。这似乎使通讯中断了。我不确定它是如何进入队列的,因为我从未将这个字符添加到队列中,但我怀疑它与将命令转换为数组有关。如果在循环运行时添加命令,则可能会中断此操作。我现在正在“SendMotorCommand”功能中进行检查,以跳过正在发送的命令。这解决了问题,但如果有人有想法,我想知道为什么会发生这种情况