2

我在将项目添加到我的ListView.

我确保ListView双缓冲并尝试优化我能想到的所有内容 - 但无论我做什么,快速添加项目时 UI 都很迟缓。

我已经有这个问题很长一段时间了,并四处寻找解决方案,但每次都放弃了,因为我无法解决它。这次我希望能解决这个问题。:)

我虽然可能会使用一些自定义解决方案?有没有可以处理“速度”的好东西?或者我可以用我当前的代码做些什么?

方法:

private void AddNewItemToListView(string gPR, string rank, string category, string name, string url, string email, string address, string phone, string metadesc, string metakeywords, string mobile, string numbofreviews, string rating, string facebook, string twitter, string googleplus, string linkedin, string sitemap, string siteage, string backlinks, string trafficvalue)
{
    Invoke(new MethodInvoker(
        delegate
            {
                string[] row1 = { url, urlSec, address, phone, metadesc, metakeywords, mob, REV, RT, gPR, FB, TW, googleplus, LI, ST, SA, BL, TV };
                ListViewItem item = new ListViewItem();

                flatListView1.Items.Add(name).SubItems.AddRange(row1);                               
            }
        ));
}
4

2 回答 2

2

您可以添加到一个列表中,而不是直接添加到 UI,该列表会慢慢被消耗并以每秒 x 个项目添加到 UI 中。我很快在下面写了一个松散的例子,但你可以在这里阅读更多:http: //msdn.microsoft.com/en-us/library/dd267312.aspx

private BlockingCollection queue;

public void Start() 
{
    queue = new BlockingCollection<string[]>();
    Task.Factory.StartNew(() => { 
        while(!queue.IsCompleted) 
        { 
            var item = queue.Take(); 
            //add to listview and control speed 
        } 
    });

    Start.Whatever.Produces.Items();
    //when all items added to queue.
    queue.CompleteAdded();

}

private void AddnewItemToListView(...) 
{
    var row = ...;
    queue.Add(row);
}
于 2012-10-11T16:17:41.260 回答
2

您能否在工作开始时使用 ListView.SuspendLayout() 方法,然后在结束时调用 ListView.ResumeLayout() ?我认为这会加快速度。您也可以尝试定期恢复以获得一些反馈。例如,通过在指定位置插入以下代码:

// Start of work
flatListView1.SuspendLayout();

// Below code inside your delegate

flatListView1.Items.Add(name).SubItems.AddRange(row1);   

if ((flatListView1.Items.Count % 1000) == 0)
{
    // Force a refresh of the list
    flatListView1.ResumeLayout();
    // Turn it off again
    flatListView1.SuspendLayout();         
}

// End of code inside delegate

// Resume layout when adding is finished

flatListView1.ResumeLayout();
于 2012-10-11T16:36:34.637 回答