Posiedziałem trochę przy kodzie i doszedłem do ciekawych wniosków. Kod działa prawidłowo kiedy włączy się debuggera i w odpowiednim miejscu postawi breakpoint. Wtedy wykonując kod krok po kroku wykonuje się też EndReading() . Pewnie ma to związek z wątkami. Niżej wrzucam całą klasę
class Connected
{
TcpClient s = new TcpClient();
NetworkStream ns;
private string returndata;
private XElement xml = new XElement("connect",
new XAttribute("userid", "----"),
new XAttribute("hashid", "--------------------"),
new XAttribute("gamemode", "1"));
public void Connect()
{
s.Connect("codearena.pl", 7654);
ns = s.GetStream();
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(xml.ToString());
ns.Write(outStream, 0, outStream.Length);
ns.Flush();
Start();
}
// Size of receive buffer.
public const int bufferSize = 8192;
// Receive buffer.
public byte[] buffer = new byte[bufferSize];
int bytesRead;
int numberOfBytesRead;
public void Start()
{
buffer = new byte[bufferSize];
bytesRead = 0;
BeginReading();
}
public void BeginReading()
{
//breakpoint this.ns.BeginRead(
buffer, bytesRead, bufferSize - bytesRead,
new AsyncCallback(EndReading),
ns);
}
public void EndReading(IAsyncResult ar)
{
numberOfBytesRead = ns.EndRead(ar);
bytesRead += numberOfBytesRead;
returndata = System.Text.Encoding.ASCII.GetString(buffer);
}
}
2 ciekawostka
Kod wyżej wrzucony do buttona1. Działa poprawnie wtedy kiedy pod returndata umieszcze jakieś przypisanie wartości z returndata do textBoxa.text np.
public void EndReading(IAsyncResult ar)
{
numberOfBytesRead = serverStream.EndRead(ar);
bytesRead += numberOfBytesRead;
returndata = System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead)
textBox2.Invoke(new Action(delegate()
{
textBox2.AppendText("New message...");
textBox2.AppendText(Environment.NewLine);
}));
textBox1.Invoke(new Action(delegate()
{
textBox1.Text=(returndata);
}));
}