为什么在线程中执行此任务需要10倍的时间而不是?

时间:2017-10-12 18:56:53

标签: c#

我遇到了一个问题,我不知道为什么会这样。我正在将项目加载到我的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);
    }
}

有没有人知道为什么会这样?我没有想法。

1 个答案:

答案 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);
    });
}