【问题标题】:Accessing the UI thread from a Socket AsyncCallback从 Socket AsyncCallback 访问 UI 线程
【发布时间】:2013-11-10 22:13:51
【问题描述】:

我对多线程甚至 Socket 编程还是很陌生,但请耐心等待:目前我正在使用 Socket.BeginReceive 接收来自另一台计算机的消息,并且接收良好。

但是,我想要使用收到的信息做的关键事情是更新 UI。 (或者更确切地说是绑定到 UI 的数据)但是,如果我尝试这样做,程序会崩溃,我希望这是因为 AsyncCallback 委托在单独的线程上运行。从另一个线程访问主窗口变量(我正在使用 WPF)的标准过程是什么?我已经阅读了有关使用 BeginInvoke() 的模糊内容,但我根本无法访问主窗口,所以我不明白如何在这里使用调用。

感谢您的帮助!

相关代码如下:

Listener.BeginReceive(Recieved, 0, Recieved.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);

private void OnReceive(IAsyncResult ar)
{
   TextBox_1.Text = "";
}

【问题讨论】:

  • 您使用的是 .Net 4.5 吗?如果是这样,请考虑使用 async/await 迁移到基于任务的异步,这样可以避免一些脑痛。
  • 恐怕只有 .net 4 :/

标签: c# wpf multithreading sockets


【解决方案1】:

您可以通过其调度程序在 UI 线程上委托事物,您可以通过 App.Current.Dispatcher 访问 -

App.Current.Dispatcher.Invoke((Action)delegate { TextBox_1.Text = ""; });

或者,如果您希望它被异步调用,请使用 BeginInvoke -

App.Current.Dispatcher.BeginInvoke((Action)delegate { TextBox_1.Text = ""; });

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多