UI 线程卡住了大约 4 秒,dispatcher.BeginInvoke() 没有解决
UI Thread stuck for about 4 seconds and dispatcher.BeginInvoke() doesn't solve it
在我的列表框中,我列出了 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 卡住?谢谢
- 绝对不应该在 ListBox 中显示 50k 项。想想一些更聪明的解决方案。
Dispatcher.BeginInvoke
在 UI 线程上进行了 运行 操作。但是您的处理程序 ListAirport_SelectedIndexChanged
已经在 UI 线程上,因此您不必 BeginInvoke
。相反,你应该在另一个线程中努力工作,并在 UI-thread. 中显示结果
在我的列表框中,我列出了 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 卡住?谢谢
- 绝对不应该在 ListBox 中显示 50k 项。想想一些更聪明的解决方案。
Dispatcher.BeginInvoke
在 UI 线程上进行了 运行 操作。但是您的处理程序ListAirport_SelectedIndexChanged
已经在 UI 线程上,因此您不必BeginInvoke
。相反,你应该在另一个线程中努力工作,并在 UI-thread. 中显示结果