2016-04-12 24 views
0

Kodumda, her onaylamada bir yöntemi çağırmak için bir zamanlayıcı kullanarak röle kartına bağlanmaya çalışıyorum. Sorun şu ki, uygulamamı çalıştırdığımda, ilk 3-4 keneler için başarılı bir bağlantı kuracağım. Ancak bundan sonra bağlantı kurulamaz. Kodumda neyin yanlış olduğunu anlayamıyorum. Herhangi bir yardım takdir edilecektir. Ben yöntem çağrıldığında asp.netTcpClient.BeginConnect (ana makine, bağlantı noktası, boş, boş); rasgele bir başarı verir

ile çalışıyorum:

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

aramak zorunda değilsiniz ancak 'TcpClient' imha edilmelidir eğer bittiğinde mümkünse 'using' kullanın. Ayrıca WaitOne ile senkronize beklemek için Async yöntemi kullanmak için anlamsız görünüyor. – Peter

+0

Zamanlayıcının kaç aralığı var? – jgauffin

+0

@Peter 'client.Connect (ana makine, bağlantı noktası) kullanılarak aynı sonucu verir. –

cevap

0

Eğer başarılı olursa bağlantınızı kapatmak asla.

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

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

sizin TcpClient hep tanzim Bu şekilde kullanmayı düşünün ve siz onun sorunu sanmıyorum .Close()

+0

Kurulmuş olan bağlantı başka bir yöntemde kullanıldığından '.Close()' kullanmam gerekiyor. Ama yardımın için teşekkürler! :) –

+0

Tüm ağ kodunuzu, tüm mantığa sahip olan tek bir nesneye sarın ve bunun yerine o nesnedeki imha şablonunu kullanın. – Peter