我正在尝试使用 WPF 创建一个多客户端/服务器聊天小应用程序,但我遇到了一些问题。不幸的是,当我按下连接按钮时,程序崩溃了。
好吧,到目前为止,我是使用客户端程序(使用线程)完成的:
public delegate void UpdateText(object txt);
我得到了那个方法:
private void UpdateTextBox(object txt)
{
if (msg_log.Dispatcher.CheckAccess())
{
Dispatcher.Invoke(new UpdateText(UpdateTextBox),txt);
}
else
{
msg_log.Dispatcher.Invoke(new UpdateText(UpdateTextBox), txt);
}
}
我正在使用 Button_Click 事件像这样连接到服务器:
private void connect_Click(object sender, RoutedEventArgs e)
{
if ((nick_name.Text == "") || (ip_addr.Text == "") || (port.Text == ""))
{
MessageBox.Show("Nick name, IP Address and Port fields cannot be null.");
}
else
{
client = new Client();
client.ClientName = nick_name.Text;
client.ServerIp = ip_addr.Text;
client.ServerPort = port.Text;
Thread changer = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(UpdateTextBox));
changer.Start();
client.OnClientConnected += new OnClientConnectedDelegate(client_OnClientConnected);
client.OnClientConnecting += new OnClientConnectingDelegate(client_OnClientConnecting);
client.OnClientDisconnected += new OnClientDisconnectedDelegate(client_OnClientDisconnected);
client.OnClientError += new OnClientErrorDelegate(client_OnClientError);
client.OnClientFileSending += new OnClientFileSendingDelegate(client_OnClientFileSending);
client.OnDataReceived += new OnClientReceivedDelegate(client_OnDataReceived);
client.Connect();
}
}
请注意 OnClient* 事件就像private void client_OnDataReceived(object Sender, ClientReceivedArguments R) { UpdateTextBox(R.ReceivedData); }
所以这些事件应该在 msg_log TextBox 中写入一些像“Connected”这样的文本
PS。txt 对象曾经是一个字符串变量,但我更改了它,因为ParameterizedThreadStart
我知道只接受对象作为参数。
任何帮助将不胜感激!
在此先感谢,乔治
编辑:按照 Abe Heidebrecht 的建议编辑了 UpdateTextBox 方法。