Frage

Ich habe eine abstrakte Basisklasse mit einem TcpClient Feld:

public abstract class ControllerBase
{
    internal protected TcpClient tcpClient;

Es hat eine Methode zum Einrichten einer Verbindung:

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);
            }
        }
    }

Und als Methoden, um Daten abzufragen:

 internal protected virtual byte[] requestData(IPAddress EthernetAddress, ushort TcpPort, byte[] data, bool IgnoreResponse)
    {
        setupConnection(EthernetAddress, TcpPort);

        //The rest of the code uses this.tcpClient 

Es gibt ein paar andere, wie requestRawData, etc ... sie für sehr spezifische Hardware-Kommunikationsprotokolle erforderlich sind, aber das ist nicht Teil dieser Frage in keiner Weise.

ich dann Klassen, die von dieser Klasse ableiten und sie die Basisklasse Methoden außer Kraft setzen:

public class Controller : ControllerBase
{
  internal virtual byte[] requestData(byte[] data, bool IgnoreResponse)
  {
        return base.requestData(this.eth0.EthernetAddress, this.eth0.TcpPort, data, IgnoreResponse);
  }

Der Code ohne Ausnahmen funktioniert, aber jedes Mal die setupConnection Methode aufgerufen wird, die TcpClient Instanz (TcpClient) scheint entsorgt zu werden, so dass ein neuer angelegt und die connect-Methode erneut aufgerufen, wirklich den Kommunikationsprozess zu verlangsamen.

Hinweis: öffentliche Methoden des Kind Klasse Aufrufs der Methode request, viele Details aus dem Entwickler abstrahiert diese Bibliothek verwendet wird.

Wie SetDevicePower (Byte Powerlevel), QueryDeviceName () etc ...

-Code wie folgt aus:

Controller controller = new Controller("172.17.0.3",34000);
string name = controller.QueryDeviceName();
controller.SetDevicePower(200);

bewirkt, dass die connect-Methode zweimal aufgerufen werden ... warum ist es, zwischen den Anrufen angeordnet ist?

War es hilfreich?

Lösung

Es gibt einige Ineffizienzen im „setupConnection“ -Methode, die Sie vielleicht in suchen. Die erste Sorge ist, dass Sie den TcpClient sind instanziieren, wenn es geschlossen ist. Dies ist nicht erforderlich. Ich würde die Null separiert und verbinden Logik in 2 Methoden, oder zumindest zwei Codeblocks innerhalb des Verfahrens:

  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);
  }

Zweitens, die catch (Exception) ist auch eine schlechte Idee, Sie können die Ausnahme nicht davon ausgehen, ein Timeout ist, da es zahlreiche andere Ausnahmen, die hier gefangen werden sollen.

Wie für Ihre Antwort: Sie können weitere Details der Implementierung in Ihrem request Verfahren liefern müssen, da es ein Anhaltspunkt drin sein könnte. Zum Beispiel schließen Sie die Verbindung? Wenn ja, würden Sie ein neues TcpClient Objekt auf dem nächsten Anruf zu setupConnection am Ende zu schaffen, das, was hier passiert sein könnte.

Hope dies wirft ein Licht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top