I'm creating a chat application in which multiple users can enter their messages and send them to the server over tcp (networkstream).
I have the following code for receiving messages:
private void ReceiveData()
{
Task.Run(() =>
{
int bufferSize = 1024;
string message = "";
byte[] buffer = new byte[bufferSize];
_NetworkStream = _TcpClient.GetStream();
AddMessage("Connected!");
while (true)
{
int readBytes = _NetworkStream.Read(buffer, 0, bufferSize);
message = Encoding.ASCII.GetString(buffer, 0, readBytes);
Console.WriteLine("I received a message: " + message);
if (message.Equals("bye"))
{
break;
}
AddMessage(message);
}
buffer = Encoding.ASCII.GetBytes("bye");
_NetworkStream.Write(buffer, 0, buffer.Length);
_NetworkStream.Close();
_TcpClient.Close();
AddMessage("Connection closed!");
});
}
Now when I call AddMessage (which I call from a different Thread, thus a different context) My application crashes. Which is quite logical given my AddMessage code:
private void AddMessage(string message)
{
this.ListBox_Messages.Items.Add(message);
}
My question is, is the addmessage function responsible for executing this on the ui thread or the function caller, in this case ReceiveData() and what would be the best and most modern way to implement it?
Thank you in advance!