2016-04-12 3 views
0

In meinem Code versuche ich, eine Relaiskarte mit einem Timer verbinden, die eine Methode mit jedem Tick aufruft. Das Problem ist, dass ich, wenn ich meine Anwendung starte, eine Verbindung erfolgreich für die ersten 3-4 Ticks bekomme. Aber danach kann es keine Verbindung mehr herstellen. Ich kann nicht herausfinden, was in meinem Code falsch ist. Jede Hilfe wäre willkommen. Ich arbeite mit asp.netTcpClient.BeginConnect (host, port, null, null); gibt zufälligen Erfolg

Die Methode aufgerufen:

private void open_ethernet_connection() 
{ 
    byte connected = 0; 

    TcpClient client = new TcpClient(); 
    try 
    { 

     IAsyncResult result = client.BeginConnect(textBox_IP.Text.Substring(0, textBox_IP.Text.IndexOf(",")), GlobalClass.port, null, null); 
     bool success = result.AsyncWaitHandle.WaitOne(1000, true); 

     if (!success) 
     { 
      connected = 0; 
      client.Close(); 
      Response.Write("Failed to connect"); 
     } 
     else connected = 1; 

     if (connected == 1) 
     { 
      ns = client.GetStream(); 
      ns.ReadTimeout = 1000; 
      SerBuf[0] = (byte)commands.GET_VER;  // get version command for ETH RLY16/02, returns software version 
      transmit(1); 
      receive(3); 
      module_version = SerBuf[2]; //print the software version on screen 
      device_found = true; 
     } 
    } 
    catch (SocketException) 
    { 
     if (selected_port == "Custom IP") 
     { 
      Response.Write("Unable to connect to module at " + GlobalClass.ipaddress); 
     } 
     else Response.Write("Unable to connect to module at " + selected_port); 
     return; 
    } 
} 
+0

nennen ich sein das Problem nicht denken, aber Sie sollten Ihre 'TcpClient' entsorgen Wenn Sie damit fertig sind, verwenden Sie 'using'. Außerdem scheint es sinnlos zu sein, die Async-Methode zu verwenden, wenn Sie synchron mit WaitOne darauf warten. – Peter

+0

Welches Intervall hat der Timer? – jgauffin

+0

@Peter mit 'client.Connect (Host, Port)' gibt das gleiche Ergebnis. –

Antwort

0

Sie nie Ihre Verbindung, wenn seine erfolgreichen schließen.

betrachten usinghttps://msdn.microsoft.com/sv-SE/library/yh598w02.aspx

using (TcpClient client = new TcpClient()) 
{ 
    Other code here... 
} 

Auf diese Weise Ihre TcpClient immer entsorgt verwendet wird, und Sie haben nicht .Close()

+0

Ich muss '.Close()' verwenden, da die hergestellte Verbindung in einer anderen Methode verwendet wird. Aber danke für deine Hilfe! :) –

+0

Sie könnten Ihren gesamten Netzwerkcode in ein Objekt mit der gesamten Logik einbinden und stattdessen das Dispose-Muster für dieses Objekt verwenden. – Peter