Witam
Piszę sobie program, który przy specyficznych warunkach musi nawiązać połączenie TCP z serwerem i wysłać odpowiedni komunikat. Moja metoda nawiązująca połączenie wygląda tak:
private void Connect()
{
try
{
clientTCP = new TcpClient();
clientTCP.Connect(serwerAdres, serwerPort);
Thread.Sleep(300);
ns = socket.GetStream();
}
catch (Exception ex)
{
if (socket.Connected)
{
ns = socket.GetStream();
}
}
}
Oprócz tego mam metodę, która jest wywoływana przez Timer'a i jej zadaniem jest wysłanie komunikatu do serwera:
private void WyslijKomunikat(object source, ElapsedEventArgs e)
{
try
{
if (!komunikat.Equals(""))
{
if (clientTCP!= null)
{
if (socket.Connected && !wyslanoPakiet)
{
WriteData(komunikat);//metoda wysyłająca dane
}
if (!clientTCP.Connected && !otrzymanoPotwierdzenie)
{
wyslanoKomunikat = false;
Connect();
WaitForData();
WriteData(komunikat);
}
}
else
{
Connect();
WaitForData();
WriteData(pakiet);
}
}
}
}
catch (Exception e1)
{
Connect();
WaitForData();
WriteData(pakiet);
}
}
I jeszcze metoda oczekująca na dane:
private void WaitForData()
{
try
{
if (clientTCP!= null && clientTCP.Connected)
{
ns.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnDataReceived), null);
}
}
catch (Exception ex)
{
}
}
I funkcja odbierająca dane:
private void OnDataReceived(IAsyncResult asyn)
{
try
{
int iRx = 0;
iRx = ns.EndRead(asyn);
odebraneDane += Encoding.ASCII.GetString(buffer, 0, iRx);
if(odebraneDane.Contains("Potwierdzenie"))
{
otrzymanoPotwierdzenie = true;
komunikat = "";
odebraneDane = "";
Disconnect();
}
WaitForData();
}
catch (Exception ex)
{
}
}
Czyli nic nadzwyczajnego. W Connect() pomiędzy linią nawiązania połączenia a pobraniem strumienia I/O wstawiłem sobie Sleep'a ponieważ serwer, do którego się łączę działa w taki sposób, że przyjmuje każde połączenie, ale jeżeli nie ma wolnego łącza które by obsłużyło klienta to wtedy rozłącza gniazdo. Problem w tym, że w takiej sytuacji, kiedy połączenie zostało nawiązane a następnie od razu rozłączone to na komputerze klienta zużycie procesora wynosi 100% :( Jest to niepokojący objaw i nie wiem jak rozwiązać ten problem. Proszę o pomoc.