我希望在一个线程中处理数据,同时保持对UI的控制。 在我的程序中,当我点击“连接”按钮时,客户端通过套接字连接到服务器,但同时我将启动一个持续等待来自服务器的消息的线程。 我的代码是认可的:
Thread ListenThread;
SocketClient socket = new SocketClient();
public MainWindow()
{
ListenThread = new Thread(Wait);
InitializeComponent();
socket.StartClient(PORT);
}
private void CONNECT_Click(object sender, RoutedEventArgs e)
{
socket.Connect();
UpdateUI();
ListenThread.Start();
}
private void Wait (){
while (socket.isConnected())
socket.WaitForSomething();
}
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
HandlePressure(e.Key);
}
问题在于,当我启动ListenThread
时,我无法使用UI(我有一个收集必须发送到服务器的命令的文本框)。
我怎么能处理这种情况?
感谢。
答案 0 :(得分:2)
您可以使用Thread 请记住,如果您需要调用方法或窗口的任何控件,您必须使用
Dispatcher.Invoke(new Action(()=>
{
//Call method or controls of window here
}));
答案 1 :(得分:0)
您应该在调用之前收集ListenThread所需的所有信息,然后将其传递给ListenThread.Start(param1,param2 ...)或ListenThread.Start(objectWithParameters)。
以这种方式获取UI线程的数据,该线程可以访问所有UI控件,而不是来自无法访问UI线程的其他线程。
完成对工作线程(ListenThread)的计算后,您可以通过Dispatcher.Invoke方法更新UI控件。调用Dispatcher委托调用UI线程,您可以在其中拥有对所有控件的完全访问权限。