po spusteni programu vytvorim tento objekt ktery se stara o komunikaci s jednim TCP serverem.
class komunikace
{
TcpClient tcpClient;
NetworkStream networkStream;
byte[] receiveBuffer;
byte[] messageToSend = new byte[12] { 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0xFF, 0x03, 0x9c, 0x41, 0x00, 0x01 };
bool connected;
bool blokace;
/// <summary>
/// konstruktor
/// </summary>
public komunikace()
{
tcpClient = new TcpClient();
tcpClient.BeginConnect("192.168.55.128", 502, new AsyncCallback(Connect), null);
receiveBuffer = new byte[1024];
//smycka ktera drzi pri zivote vlakno a chtel bych ji vyresit jinak
while (true)
{
if (connected)
{
if (!blokace)
{
networkStream.Write(messageToSend, 0, 12);
blokace = true;
}
}
}
}
private void Connect(IAsyncResult at)
{
tcpClient.EndConnect(at);
networkStream = tcpClient.GetStream();
connected = true;
networkStream.BeginRead(receiveBuffer, 0, 1024, new AsyncCallback(ReadData), null);
}
/// <summary>
/// cteni dat
/// </summary>
/// <param name="at"></param>
private void ReadData(IAsyncResult at)
{
int receive = networkStream.EndRead(at);
if (!networkStream.DataAvailable)
{
//zpracovani dat, odblokovani odeslani
blokace = false;
}
networkStream.BeginRead(receiveBuffer, 0, 1024, new AsyncCallback(ReadData), null);
}
}
pokud techto objektu vytvorim vic a to co je v konstruktoru spustim v samostatnych vlaknech tak me ty while cykli moc zatezuji procesor a pritom nic nedelaji. Myslenka proc to takto delam byla aby kazde TCP spojeni mohlo bezet nezavisle a nebylo brzdeno pri odesilani a prijmu ostatnich v pripade ze by komunikace byla jen v hlavnim vlaknu.
|