WPF 文本块更新
WPF TextBlock Update
只是出于学术目的,我正在将以前的代码从 windows 形式改编为 WPF,问题是我不明白调用是如何工作的,希望有人能给我一些启发我阅读了一些教程并向我解释了我可以如何调整此代码。
每次有人在 send_click 上发送消息时,它都会发送到服务器,该服务器会向所有连接的套接字发送消息。我的问题是,如何调整此代码以制作文本块 "updatable"?它说它已经被另一个线程(主线程)使用。
这是我的应用程序包含的代码。提前致谢!
更新 #1:这是我第一次尝试使用调度程序调用 http://gyazo.com/42008aacbec2f8494bb7c6c33889d9ad 但是我不理解这个 walloftext 背后的原因。
public Lobby()
{
InitializeComponent();
ctThread = new Thread(getMessage);
ctThread.Start();
clientSocket.Connect("127.0.0.1", 8888);
serverStream = clientSocket.GetStream();
}
TcpClient clientSocket = new System.Net.Sockets.TcpClient();
NetworkStream serverStream = default(NetworkStream);
string readData = null;
Thread ctThread;
private void btnSend_Click(object sender, RoutedEventArgs e)
{
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(txtInput.Text);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
}
private void getMessage()
{
while (true)
{
serverStream = clientSocket.GetStream();
int buffSize = 0;
byte[] inStream = new byte[10025];
buffSize = clientSocket.ReceiveBufferSize;
serverStream.Read(inStream, 0, buffSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
readData = "" + returndata;
Dispatcher.BeginInvoke(new Action(() =>
{
txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData;
}));
}
}
msg
在它自己的线程上,因此来自该函数的 UI 更新必须编组到 UI 线程。您使用 Dispatcher.BeginInvoke
来执行此操作:
Dispatcher.BeginInvoke(new Action(() =>
{
if (txtContent.Text != null)
{
txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData;
}
});
请注意,您应该考虑使用绑定而不是直接操作 UI。
只是出于学术目的,我正在将以前的代码从 windows 形式改编为 WPF,问题是我不明白调用是如何工作的,希望有人能给我一些启发我阅读了一些教程并向我解释了我可以如何调整此代码。
每次有人在 send_click 上发送消息时,它都会发送到服务器,该服务器会向所有连接的套接字发送消息。我的问题是,如何调整此代码以制作文本块 "updatable"?它说它已经被另一个线程(主线程)使用。 这是我的应用程序包含的代码。提前致谢!
更新 #1:这是我第一次尝试使用调度程序调用 http://gyazo.com/42008aacbec2f8494bb7c6c33889d9ad 但是我不理解这个 walloftext 背后的原因。
public Lobby()
{
InitializeComponent();
ctThread = new Thread(getMessage);
ctThread.Start();
clientSocket.Connect("127.0.0.1", 8888);
serverStream = clientSocket.GetStream();
}
TcpClient clientSocket = new System.Net.Sockets.TcpClient();
NetworkStream serverStream = default(NetworkStream);
string readData = null;
Thread ctThread;
private void btnSend_Click(object sender, RoutedEventArgs e)
{
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(txtInput.Text);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
}
private void getMessage()
{
while (true)
{
serverStream = clientSocket.GetStream();
int buffSize = 0;
byte[] inStream = new byte[10025];
buffSize = clientSocket.ReceiveBufferSize;
serverStream.Read(inStream, 0, buffSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
readData = "" + returndata;
Dispatcher.BeginInvoke(new Action(() =>
{
txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData;
}));
}
}
msg
在它自己的线程上,因此来自该函数的 UI 更新必须编组到 UI 线程。您使用 Dispatcher.BeginInvoke
来执行此操作:
Dispatcher.BeginInvoke(new Action(() =>
{
if (txtContent.Text != null)
{
txtContent.Text = txtContent.Text + Environment.NewLine + " >> " + readData;
}
});
请注意,您应该考虑使用绑定而不是直接操作 UI。