我遇到了一个问题,我不知道为什么会这样。我正在将项目加载到我的listview中,因为需要添加20,000多个项目,我想在一个线程中执行它,但是与非线程相比,它执行的时间超长。
private void mainFrm_Load(object sender, EventArgs e)
{
airportListView.Items.Clear();
var loadingThread = new Thread(loadData);
loadingThread.Start();
}
private void loadData()
{
foreach (var currAirport in Program.AirportManager.Airports)
{
var listViewItem = new ListViewItem(currAirport.Name);
listViewItem.SubItems.Add(currAirport.ID);
listViewItem.SubItems.Add(currAirport.Country);
airportListView.Items.Add(listViewItem);
}
}
这至少需要10倍的时间:
private void mainFrm_Load(object sender, EventArgs e)
{
airportListView.Items.Clear();
foreach (var currAirport in Program.AirportManager.Airports)
{
var listViewItem = new ListViewItem(currAirport.Name);
listViewItem.SubItems.Add(currAirport.ID);
listViewItem.SubItems.Add(currAirport.Country);
airportListView.Items.Add(listViewItem);
}
}
有没有人知道为什么会这样?我没有想法。
答案 0 :(得分:0)
我相信这是因为GUI项目试图是线程安全的。本质上,当你在另一个线程中向ListView添加一个项目时,很可能每次添加一个项目时都会在GUI线程上调用一个方法,或者至少调用某种类型的锁定机制,从而降低性能。行为。
您应该在GUI线程上对GUI项执行操作。
如果您希望GUI在添加时具有响应能力,请收集所有项目,然后在收集完所有项目后使用AddRange()。
List<ListViewItem> toAdd = new List<ListViewItem>();
private void mainFrm_Load(object sender, EventArgs e)
{
airportListView.Items.Clear();
var loadingThread = new Thread(loadData);
loadingThread.Start();
}
private void loadData()
{
foreach (var currAirport in Program.AirportManager.Airports)
{
var listViewItem = new ListViewItem(currAirport.Name);
listViewItem.SubItems.Add(currAirport.ID);
listViewItem.SubItems.Add(currAirport.Country);
toAdd.Add(listViewItem);
}
airportListView.BeginInvoke(() =>
{
airportListView.Items.AddRange(toAdd);
});
}