C# WPF应用程序中的多线程

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);

我希望在线程中处理数据,同时维护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(我有一个文本框,用于收集我必须发送到服务器的命令)。 我如何处理这种情况? 谢谢。

您可以使用线程。
请记住,若要调用方法或窗口的任何控件,必须使用

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
不能直接控制用户界面,我不能使用用户界面。对不起,你能给我看一下这个文件的所有代码吗?现在可以了,我不知道哪里出了错。谢谢。