문제

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가 닫힐 때 인스턴스화한다는 것입니다. 이것은 필요하지 않습니다. NULL Check를 분할하고 로직을 두 가지 메소드 또는 방법 내에서 최소한 두 개의 코드 블록으로 연결합니다.

  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 객체를 만들게됩니다. 여기서 일어나는 일이 될 수 있습니다.

이것이 약간의 빛을 흘리기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top