WPF应用程序中的多线程

时间:2016-09-17 10:17:46

标签: c# wpf multithreading user-interface

我希望在一个线程中处理数据,同时保持对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(我有一个收集必须发送到服务器的命令的文本框)。 我怎么能处理这种情况? 感谢。

2 个答案:

答案 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线程,您可以在其中拥有对所有控件的完全访问权限。