Witam,
mam problem ze swoim serwerem, napisany jest w C#, problem polega na tym (podaje informacje od użytkowników) że:
- zawiesza się serwer (aplikacja) Framework 4 Client
- zawiesza się windows home (niestety to jest "serwer")
- aplikacja bądź windows home, generują lagi wysyłając z opóźnieniem informacje na port COM
Cytując wyrwane części kodu, mniej więcej obrazujące zasadę działania serwera to wygląda to tak:
// Tworzę TcpListener na porcie 6645
this.tcpListener = new TcpListener(IPAddress.Any, 6645);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
// do stworzonego powyżej wątku przekazuje tcpListener i w petli while(true) oczekuje i pobieram przychodzące połączenia:
TcpClient client = this.tcpListener.AcceptTcpClient();
// po odebraniu połączenia przekazuje client do następnego wątku na którym odbywa się wymiana danych między clientem i moim serwerem tj:
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleClientComm), client);
// nastepnie odbieram dane od polaczonego klienta
tcpClient = (TcpClient)client;
NetworkStream clientStream;
try
{
clientStream = tcpClient.GetStream();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
tcpClient.Close();
return;
}
byte[] message = new byte[4096];
int bytesRead;
bytesRead = 0;
// Odbieram dane
try {
bytesRead = clientStream.Read(message, 0, 4096);
}
catch {
// Jesli klient sie rozlaczyl i nie wyslal danych funkcja jest przerywana
return;
}
if (bytesRead == 0) {
return;
}
clientStream.Flush();
// --- nastepnie obrabiam odebrane dane i dodaje je do kolejki ,Queue,
KolejkaCOM.Enqueue(text);
tcpClient.Close();
clientStream.Close();
// dane z kolejki sa w osobnym Thread - watku wysylane co jakis czas na port COM, sa rowniez sciagane z kolejki zeby dane sie tam nie gromadzily tj:
SerialPort port = new SerialPort(PortName, 9600, Parity.None, 8, StopBits.One);
text = (byte[])KolejkaCOM.Dequeue();
port.Write(text, 0, text.Length);
W zasadzie to jest cała najważniejsza część programu i pytanie jest takie czy może coś źle zaprogramowałem i to jest powodem takich zawieszeń bądź opóźnień?
Dodam że serwer może przyjmować około 8 - 20 połączeń na minute (jednak może się zdażyć że 4-12 połączeń w danej sekundzie poprzez nakładanie się połączeń z losowości "wciskania przycisków" na pilotach przez użytkowników), dziennie około 2000, chociaż są to dane nie pewne.
Czy mógłbyś ktoś mi pomóc?
pozdrawiam
edit:
- dodam że program kompiluje przy pomocy VS2010 Express (aczkolwiek przy pomocy VS2010 ultimate sprawa wygląda tak samo)
- program nie zawiesza się od razu jest to że tak powiem losowe, czasem po 5minutach czasem po dwóch godzinach