У меня есть абстрактный базовый класс с полем TcpClient:
public abstract class ControllerBase
{
internal protected TcpClient tcpClient;
У него есть способ установить соединение:
private void setupConnection(IPAddress EthernetAddress, ushort TcpPort)
{
if (this.tcpClient == null || !this.tcpClient.Connected)
{
this.tcpClient = new TcpClient();
try
{
this.tcpClient.Connect(EthernetAddress, TcpPort);
}
catch(Exception ex)
{
throw new TimeoutException("The device did not respond.\n" + ex.Message);
}
}
}
И чем методы запроса данных:
internal protected virtual byte[] requestData(IPAddress EthernetAddress, ushort TcpPort, byte[] data, bool IgnoreResponse)
{
setupConnection(EthernetAddress, TcpPort);
//The rest of the code uses this.tcpClient
Есть несколько других, таких как requestRawData и т. д., Они требуются для очень специфических аппаратных протоколов связи, но это никоим образом не является частью этого вопроса.
Затем у меня есть классы, производные от этого класса, и они переопределяют методы базового класса:
public class Controller : ControllerBase
{
internal virtual byte[] requestData(byte[] data, bool IgnoreResponse)
{
return base.requestData(this.eth0.EthernetAddress, this.eth0.TcpPort, data, IgnoreResponse);
}
Код работает без каких-либо исключений, но каждый раз, когда вызывается метод setupConnection, экземпляр TcpClient (tcpClient) кажется удаленным, поэтому создается новый и снова вызывается метод подключения, что действительно замедляет процесс связи.
Примечание. Открытые методы дочернего класса вызывают метод requestData, абстрагируя многие детали от разработчика с помощью этой библиотеки.
Такие как SetDevicePower (byte PowerLevel), QueryDeviceName () и т. д.
Вот такой код:
Controller controller = new Controller("172.17.0.3",34000);
string name = controller.QueryDeviceName();
controller.SetDevicePower(200);
вызывает двойной вызов метода подключения ... почему он удаляется между вызовами?





В методе "setupConnection" есть некоторые недостатки, которые вы, возможно, захотите изучить. Первая проблема заключается в том, что вы создаете экземпляр TcpClient, когда он закрыт. В этом нет необходимости. Я бы разделил нулевую проверку и подключил логику на 2 метода или, по крайней мере, на два блока кода внутри метода:
if (this.tcpClient == null)
{
this.tcpClient = new TcpClient();
}
try
{
if (!this.tcpClient.Connected)
{
this.tcpClient.Connect(EthernetAddress, TcpPort);
}
}
catch(Exception ex)
{
throw new TimeoutException("The device did not respond.\n" + ex.Message);
}
Во-вторых, перехват (исключение) также является плохой идеей. Вы не можете предполагать, что исключение - это тайм-аут, так как здесь следует перехватывать множество других исключений.
Что касается вашего ответа: вам, возможно, придется предоставить дополнительные сведения о реализации в вашем методе requestData, поскольку там может быть подсказка. Например, вы закрываете соединение? Если это так, вы в конечном итоге создадите новый объект TcpClient при следующем вызове setupConnection, что может быть тем, что здесь происходит.
Надеюсь, это проливает свет.