【问题标题】:Multithreading in WPF applicationWPF 应用程序中的多线程
【发布时间】:2016-09-17 10:17:45
【问题描述】:

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

【问题讨论】:

    标签: c# wpf multithreading user-interface


    【解决方案1】:

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

    Dispatcher.Invoke(new Action(()=>
    {
    //Call method or controls of window here
    }));
    

    【讨论】:

    • 我已经使用了Thread这个类。函数Wait不直接控制UI,我不能使用UI。
    • 对不起,你能告诉我这个文件的所有代码吗?
    • 现在可以了,我不知道哪里出错了。非常感谢。
    【解决方案2】:

    您应该在调用 ListenThread 之前收集所需的所有信息,然后将其传递给 ListenThread.Start(param1, param2...) 或 ListenThread.Start(objectWithParameters)。

    通过这种方式,您可以在 UI 线程上获取数据,该线程可以访问所有 UI 控件,而不是来自无法访问 UI 线程的另一个线程。

    当您在工作线程 (ListenThread) 上完成计算后,您可以通过 Dispatcher.Invoke 方法更新 UI 控件。调用 Dispatcher 代表调用 UI 线程,您可以在其中拥有对所有控件的完全访问权限。

    【讨论】:

    • ListenThread (Wait) 调用的函数中,我需要我已经拥有的信息(在这种情况下为socket)。我不确定你说什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多