C# WPF应用程序中的多线程
我希望在线程中处理数据,同时维护UI上的控件。 在我的程序中,当我单击“连接”按钮时,客户端通过套接字连接到服务器,但同时我希望启动一个线程,持续等待来自服务器的消息。 我的代码大致如下:C# WPF应用程序中的多线程,c#,wpf,multithreading,user-interface,C#,Wpf,Multithreading,User Interface,我希望在线程中处理数据,同时维护UI上的控件。 在我的程序中,当我单击“连接”按钮时,客户端通过套接字连接到服务器,但同时我希望启动一个线程,持续等待来自服务器的消息。 我的代码大致如下: Thread ListenThread; SocketClient socket = new SocketClient(); public MainWindow() { ListenThread = new Thread(Wait);
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(我有一个文本框,用于收集我必须发送到服务器的命令)。
我如何处理这种情况?
谢谢。您可以使用线程。请记住,若要调用方法或窗口的任何控件,必须使用
Dispatcher.Invoke(new Action(()=>
{
//Call method or controls of window here
}));
您可以使用线程。请记住,若要调用方法或窗口的任何控件,必须使用
Dispatcher.Invoke(new Action(()=>
{
//Call method or controls of window here
}));
调用ListenThread之前,应该收集ListenThread所需的所有信息,然后将其传递给ListenThread.Start(param1,param2…)或ListenThread.Start(objectWithParameters) 通过这种方式,您可以在UI线程上获取数据,该线程可以访问所有UI控件,而不是从另一个无法访问UI线程的线程获取数据
在工作线程(ListenThread)上完成计算后,可以通过方法更新UI控件。调用Dispatcher会委派对UI线程的调用,在UI线程中您可以完全访问所有控件。您应该在调用ListenThread之前收集ListenThread所需的所有信息,然后将其传递给ListenThread.Start(param1,param2…)或ListenThread.Start(objectWithParameters) 通过这种方式,您可以在UI线程上获取数据,该线程可以访问所有UI控件,而不是从另一个无法访问UI线程的线程获取数据
在工作线程(ListenThread)上完成计算后,可以通过方法更新UI控件。调用Dispatcher会将调用委托给UI线程,在这里您可以完全访问所有控件。在由
ListenThread
(Wait
)调用的函数中,我需要我已经拥有的信息(socket
)。我不确定是否理解您所说的内容。在由ListenThread
(Wait
)调用的函数中,我需要已有的信息(在本例中为socket
)。我不太明白你说的话。我已经在使用类线程了。函数Wait
不能直接控制用户界面,我不能使用用户界面。对不起,你能给我看一下这个文件的所有代码吗?现在可以了,我不知道哪里出了错。非常感谢。我已经使用了类线程
。函数Wait
不能直接控制用户界面,我不能使用用户界面。对不起,你能给我看一下这个文件的所有代码吗?现在可以了,我不知道哪里出了错。谢谢。