추상 기본 클래스의 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);
연결 방법이 두 번 호출됩니다 ... 왜 통화 사이에 폐기 되는가?
해결책
"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 객체를 만들게됩니다. 여기서 일어나는 일이 될 수 있습니다.
이것이 약간의 빛을 흘리기를 바랍니다.