Поле TcpClient абстрактного базового класса постоянно удаляется

У меня есть абстрактный базовый класс с полем 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);

вызывает двойной вызов метода подключения ... почему он удаляется между вызовами?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
367
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В методе "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, что может быть тем, что здесь происходит.

Надеюсь, это проливает свет.

Другие вопросы по теме