Wpf UI线程卡住约4秒,dispatcher.BeginInvoke()无法解决此问题

Wpf UI线程卡住约4秒,dispatcher.BeginInvoke()无法解决此问题,wpf,asynchronous,ui-thread,Wpf,Asynchronous,Ui Thread,在我的列表框中,我列出了5万多个机场。选择某个特定机场时,我需要在UI上加载其跑道和其他信息。这是我的密码: private void ListAirport_SelectedIndexChanged(object sender, SelectionChangedEventArgs e) { ... Dispatcher.BeginInvoke(new Action(() => {

在我的列表框中,我列出了5万多个机场。选择某个特定机场时,我需要在UI上加载其跑道和其他信息。这是我的密码:

    private void ListAirport_SelectedIndexChanged(object sender, SelectionChangedEventArgs e)
    {
     ...
              Dispatcher.BeginInvoke(new Action(() =>
              {
                DataTable dt = TxtFileToTable(Environment.CurrentDirectory + @"\\r5_IOS.txt");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (ListAirport.SelectedItem != null && ListAirport.SelectedItem.ToString() == dt.Rows[i][0].ToString())
                    {
                        ListRunway.Items.Add(dt.Rows[i][1]);
                        ListRunway.SelectedIndex = 0;//select the default runway
                    }
                }
              }
              ));
    }
我想使用Dispatcher.BeginInvoke来避免UI被卡住,但它似乎没有帮助。为什么以及如何避免UI被卡住?谢谢

您绝对不应该在列表框中显示50k项。考虑一些更聪明的解决方案。 Dispatcher.BeginInvoke使您的操作在UI线程上运行。但您的处理程序ListListendIndexChanged已经在UI线程上,所以您不必开始唤醒。相反,您应该在另一个线程中完成您的艰苦工作,并在UI线程中显示结果。
那么五万个项目是相当多的添加到一个名单。。。您是否考虑过不直接填充控件?Dispatcher.BeginInvoke不会简单地修复UI锁定。您需要在后台线程上进行处理,然后在准备好显示时通过Dispatcher将该信息传递给UI线程。您的列表视图中肯定没有虚拟化。默认情况下应该启用它,但有很多方法可以意外禁用它…@mana,你能想象这个用户在搜索某个东西时会读取50k行文本吗?发发慈悲:创建一些搜索功能,或者在树层次结构中对这些项目进行分组可能会更舒服。。。想一想:哦,50k行是按字母顺序排列的,我有搜索功能,谢谢。@Sam Sch