【发布时间】:2019-07-11 02:18:30
【问题描述】:
我正在创建一个聊天应用程序,多个用户可以在其中输入他们的消息并通过 tcp(网络流)将它们发送到服务器。
我有以下代码用于接收消息:
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!");
});
}
现在,当我调用 AddMessage(我从不同的线程调用,因此使用不同的上下文)时,我的应用程序崩溃了。考虑到我的 AddMessage 代码,这很合乎逻辑:
private void AddMessage(string message)
{
this.ListBox_Messages.Items.Add(message);
}
我的问题是,addmessage 函数是负责在 ui 线程或函数调用者上执行此操作,在本例中为 ReceiveData(),实现它的最佳和最现代的方法是什么?
提前谢谢你!
【问题讨论】:
-
你在 StackOverflow 中有很多例子吗,比如this。
-
诸如“什么是[做某事]最好和最现代的方式”之类的问题在这里无法回答。提供的任何答案都将在五分钟后过时。
-
@nassiel:不就是
Control.Invoke()吗? -
@nassiel 我的老师说这已经过时了,我们不允许使用它
标签: c# multithreading tcp async-await