UI线程卡住了大约4秒,而dispatcher.BeginInvoke()没有解决它

时间:2018-04-24 08:19:56

标签: wpf asynchronous ui-thread

在我的ListBox中,我列出了超过50,000个机场。选择特定机场后,我需要在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卡住?感谢。

1 个答案:

答案 0 :(得分:1)

  1. 你绝对不应该在ListBox中显示50k项目。想想一些更聪明的解决方案。
  2. Dispatcher.BeginInvoke使您的操作在UI线程上运行。但是您的处理程序ListAirport_SelectedIndexChanged已经在UI线程上,因此您不必BeginInvoke。而不是它你应该在另一个线程中努力工作,并在UI线程中显示结果。