【问题标题】:Can't access listbox from random method in code behind (C#)无法从代码后面的随机方法访问列表框(C#)
【发布时间】:2018-05-24 00:17:07
【问题描述】:

works here ----- crashes here ----- 所以我正在制作这个基于消息队列的服务器客户端聊天系统,在客户端,我有一个接收消息的线程。我的列表框的名称是'displaymsg'

这是我的线程池方法

public void getmsg(object ob)
    {
        string msg = "";

        while (true)
        {
            msg = mRecieve.GetMessages();
            displaymsg.Items.Add(msg);
        }
    }

但程序在到达 displaymsg.Items.Add(msg) 部分时崩溃。 为了检查它是否到达那里并且它是否工作正常,我用MessageBox.Show(msg) 替换它,它工作正常,我在一个弹出框中收到我从另一端发送的每条消息。我是 wpf 的新手,所以现在有点迷路了......请帮忙!

【问题讨论】:

  • 在非工作情况下收到什么消息?我怀疑这是由于尝试从错误的线程访问控件,但没有错误消息,我无法确定。
  • 它不显示任何错误消息。只是崩溃说“客户端已停止工作,Windows 正在报告此问题”
  • @Shrey 你的程序中的while循环真的是这样写的吗? while(true) 无限继续。如果您要创建无限数量的要添加的项目,它将会崩溃,因为您正在消耗所有的计算机资源。
  • 其实为了让它先工作,我根本没有循环。我只是做字符串味精=“”; displaymsg.Items.Add("这里有东西");当我使用 displaymsg 时它会崩溃,但当我使用 messagebox 时它会工作。
  • 是的,当然@Jamin。这是链接stackoverflow.com/questions/9732709/…

标签: c# .net wpf xaml listbox


【解决方案1】:

您不能从非 UI 线程访问控件。您必须使用 a dispatcher 将其编组回 UI 线程:

displaymsg.Dispatcher.Invoke(() => displaymsg.Items.Add(msg));

如果你不想等待结果,你也可以解雇并忘记:

displaymsg.Dispatcher.BeginInvoke(() => displaymsg.Items.Add(msg));

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2020-01-11
相关资源
最近更新 更多