繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM