[英]Why does it take 10x the time to execute this task in a thread than not?
我遇到了一个问题,我不知道为什么会这样。 我正在将项目加载到我的列表视图中,因为有 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);
}
}
有人知道为什么会这样吗? 我没有想法了。
我相信这是因为 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);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.